Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭКЗ_2020_ООП.odt
Скачиваний:
23
Добавлен:
23.06.2020
Размер:
217.5 Кб
Скачать

75. Как осуществить вызов базовой реализации функции при её переопределении в

дочернем классе?

Нужно указать полное имя вызываемого метода, включая имя базового класса

76. Как связаны виртуальные функции и полиморфизм?

В C++ полиморфизм поддерживается как во время выполнения, так в период компиляции программы. Перегрузка операторов и функций — это примеры полиморфизма, относящегося ко времени компиляции. Но, несмотря на могущество механизма перегрузки операторов и функций, он не в состоянии решить все задачи, которые возникают в реальных приложениях объектно-ориентированного языка программирования. Поэтому в C++ также реализован полиморфизм периода выполнения на основе использования производных классов и виртуальных функций.

77. Что такое переопределение функций?

• Переопределение функций – создание функции в дочернем классе с

сигнатурой, совпадающей с функцией в родительском классе

• Для определения вызываемой функции компилятор сначала ищет ее в

дочернем классе, если не находит, то ищет в базовых классах по цепочке

наследования

• Переопределение функций позволяет изменять поведение базового класса

78. Работает ли переопределение для приватных функций?

Когда мы переопределяем родительский метод в дочернем классе, то дочерний метод не наследует спецификатор доступа родительского метода с тем же именем. Используется тот спецификатор доступа, который указан в дочернем классе. Таким образом, метод, определённый как private в родительском классе, может быть переопределён как public в дочернем классе, или наоборот!

79. Что такое таблица виртуальных функций?

Виртуальная таблица в С++ — это таблица поиска функций для выполнения вызовов функций в режиме позднего (динамического) связывания. Виртуальную таблицу ещё называют «vtable», «таблицей виртуальных функций» или «таблицей виртуальных методов».

Виртуальная таблица на самом деле довольно-таки проста, хотя её сложно описать словами. Во-первых, любой класс, который использует виртуальные функции (или дочерний класс, родительский класс которого использует виртуальные функции), имеет свою собственную виртуальную таблицу. Это обычный статический массив, который создаётся компилятором во время компиляции. Виртуальная таблица содержит по одной записи на каждую виртуальную функцию, которая может быть вызвана объектами класса. Каждая запись в этой таблице — это указатель на функцию, указывающий на наиболее дочерний метод, доступный объекту этого класса.

80. Как себя ведут виртуальные функции в конструкторе и деструкторе?

Конструкторы и деструкторы классов при вызове объявленных виртуальными функций реально вызывали функции только своего класса. Есть правило: виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора.

При создании объекта конструкторы в иерархии вызываются от базового класса к самому последнему унаследованному. Для деструкторов все наоборот. Конструктор класса всегда работает в предположении, что его дочерние классы еще не созданы, поэтому он не имеет права вызывать функции, определенные в них. И для виртуальной функций ему ничего не остается, как только вызвать то, что определено в нем самом. Механизм виртуальных функций тут не работает, так как таблица виртуальных функций дочернего класса еще не перекрыла текущую таблицу. В деструкторе все наоборот. Деструктор знает, что во время его вызова все дочерние классы уже разрушены и вызывать у них ничего уже нельзя, поэтому он замещает адрес таблицы виртуальных функций на адрес своей собственной таблицы и благополучно вызывает версию виртуальной функции, определенной в нем самом. Получается, виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора.