У меня проблемы с пониманием виртуальных функций. Когда я перегружаю виртуальную функцию, вызывается ли только новая производная функция? Или как производные, так и базовые функции? Потому что я заметил, что когда вызываются виртуальные деструкторы, вызываются деструкторы базового и производного классов.
Виртуальные деструкторы, вызывающие как производные, так и базовые деструкторы
Ответы (2)
деструкторы являются специальными функциями-членами в этом конкретном отношении.
Если у вас есть виртуальный деструктор базового класса, то он будет правильно вызывать деструкторы базового, а также производного класса во время полиморфного удаления (вызов удаления для указателя базового класса pointinf на производный класс объект.).
Однако другие виртуальные функции-члены не имеют того же особого статуса, что и деструкторы. Вызывается только функция, определенная для соответствующего типа объекта. Если вам нужно вызвать какую-либо другую функцию, вам нужно сделать это явно.
объект производного класса является не чем иным, как своего рода оболочкой для объекта базового класса. Таким образом, в случае деструкторов следует вызывать оба деструктора, что является ожидаемым поведением.
В случае виртуальной функции вам предоставляется возможность заменить функцию в базовом классе. Поэтому использование указателя базового класса для хранения объекта производного класса вызовет только виртуальную функцию в производном классе.