Зачем нам нужны виртуальные методы в C ++?
blockquote>Быстрый ответ:
- Он предоставляет нам один из необходимых «ингредиентов», 1 для объектно-ориентированного программирования .
В Bjarne Stroustrup C ++ Programming: Principles and Practice, (14.3):
Виртуальная функция предоставляет возможность определять функцию в базовом классе и имеют функцию с тем же именем и типом в производном классе, вызываемом, когда пользователь вызывает функцию базового класса. Это часто называют полиморфизмом во время выполнения , динамической отправки или диспетчером времени выполнения , поскольку вызванная функция определяется во время выполнения на основе тип используемого объекта.
blockquote>
- Это самая быстрая более эффективная реализация, если вам нужен вызов виртуальной функции 2.
Для обработки виртуального вызова требуется одна или несколько частей данных, относящихся к производному объекту 3. Обычно обычно делается так, чтобы добавить адрес таблицы функций , Эта таблица обычно называется виртуальной таблицей виртуальной таблицы или виртуальной функции , а ее адрес часто называют виртуальным указателем . Каждая виртуальная функция получает слот в виртуальной таблице. В зависимости от типа объекта вызывающего (производного), виртуальная функция, в свою очередь, вызывает соответствующее переопределение.
blockquote>
1. Использование наследования, полиморфизма во время выполнения и инкапсуляции является наиболее распространенным определением объектно-ориентированного программирования .
2. Вы не можете использовать функциональность кода быстрее или использовать меньшую память, используя другие языковые функции, чтобы выбирать среди альтернатив во время выполнения. Bjarne Stroustrup C ++ Programming: Принципы и практика. (14.3.1).
3. Что-то сказать, какая функция действительно вызывается, когда мы вызываем базовый класс, содержащий виртуальную функцию.
Из Сравнение последовательностей и других типов в учебнике Python:
Сравнение использует лексикографическое упорядочение: сначала сравниваются первые два элемента, и если они отличаются друг от друга определяет результат сравнения; если они равны, сравниваются следующие два элемента и так далее, пока не будет исчерпана любая последовательность.
blockquote>
Поскольку я не нашел объяснения сравнения списка / кортежа, используя, в первую очередь, «лексикографическое упорядочение», в первую очередь, это попытка объяснить это «своими словами». Во-первых, вот несколько примеров списков, которые упоминаются в объяснении ниже:
a = [1, 2, 3]
b = [1, 2, 10]
c = [1, 2, 3, 100]
d = [1, 2, 3]
e = [1, 2, 3, 4, 'a']
f = ['a', 'b', 'c']
Пара элементов в каждом индексе сравнивается по очереди. Таким образом, сравнение a
с b
приведет к сравнению 1
, 2
, сравниваемого с 2
, а 3
сравнивается с 10
.
] Сравнение пар остановится, когда либо обнаружена неравная пара элементов , либо - если списки имеют разную длину - достигнут конец более короткого списка.
Например, при сравнении a
и b
сравнения будут останавливаться, когда сравниваются 3
и 10
. При сравнении b
и c
сравнения останавливаются, когда сравниваются 10
и 3
.
Как только найдена неравная пара, общий результат является результатом сравнения неравных Предметы. Это относится к тому, являются ли списки одинаковой длины или нет - например, список b
больше, чем список c
, потому что 100
в c
никогда не входит в игру.
Например , при сравнении a
с b
общий результат будет результатом сравнения 3
с 10
. a < b -> True
, потому что 3
меньше 10
. a > b -> False
, потому что 3
не больше 10
. a == b -> False
, поскольку 3
не равно 10
.
Если один из списков короче и его N элементов равны первым N элементам более длинного списка, как в случае a
и c
, более короткий список будет считаться меньшим, чем более длинный список (поэтому a
меньше c
).
Два списка будут сравниваться как равные только , если они имеют одинаковую длину, и все пары элементов сравниваются как равные.
Примечание о типах: если элементы в паре не сопоставимы, сравнение будет неудачно с TypeError
, как обычно. Например, сравнение списка a
с f
не будет выполнено, если 1
сравнивается с 'a'
. Но также обратите внимание, что списки d
и e
можно сравнить, поскольку 'a'
в e
никогда не сравнивается ни с чем в d
.