Виртуальные деструкторы, вызывающие как производные, так и базовые деструкторы

У меня проблемы с пониманием виртуальных функций. Когда я перегружаю виртуальную функцию, вызывается ли только новая производная функция? Или как производные, так и базовые функции? Потому что я заметил, что когда вызываются виртуальные деструкторы, вызываются деструкторы базового и производного классов.


person sgtHale    schedule 18.02.2013    source источник


Ответы (2)


деструкторы являются специальными функциями-членами в этом конкретном отношении.
Если у вас есть виртуальный деструктор базового класса, то он будет правильно вызывать деструкторы базового, а также производного класса во время полиморфного удаления (вызов удаления для указателя базового класса pointinf на производный класс объект.).

Однако другие виртуальные функции-члены не имеют того же особого статуса, что и деструкторы. Вызывается только функция, определенная для соответствующего типа объекта. Если вам нужно вызвать какую-либо другую функцию, вам нужно сделать это явно.

person Alok Save    schedule 18.02.2013
comment
Хорошо, это имеет больше смысла. Думаю, никто не удосужился рассказать мне об особенностях виртуальных деструкторов. - person sgtHale; 18.02.2013
comment
Дело не в том, что виртуальные деструкторы особенные. Так работают все деструкторы, как и конструкторы, но не обычные функции. Конструкторы и деструкторы также являются особенными в других отношениях, например. у них нет имён. - person MSalters; 18.02.2013

объект производного класса является не чем иным, как своего рода оболочкой для объекта базового класса. Таким образом, в случае деструкторов следует вызывать оба деструктора, что является ожидаемым поведением.

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

person Vijay    schedule 18.02.2013