@kaka888
C, C++, Qt, Python Flask, MySQL, Lua

Как в деструкторе базового класса вызвать переопределённый метод?

Есть объект вида
Parent* obj = new Child();

Как в деструкторе родительского класса вызвать виртуальный метод с переопределённой дочерним классом реализацией?

Или как сделать так, чтобы вызывался деструктор только дочернего класса, а деструктор базового класса не вызывался?
  • Вопрос задан
  • 191 просмотр
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Никак. Когда работает деструктор базового класса объект наследник уже не существует.
Так что "чистите" наследник в деструкторе наследника, а базовый класс в деструкторе базового класса.
Вот старинная статья на хабре, но, на сколько я знаю, и сейчас все работает так.
Ответ написан
Комментировать
@code_panik
Порядок вызова деструкторов определяется стандартом языка. Сначала выполняется деструктор дочернего класса, затем деструкторы членов дочернего класса и только потом родительские деструкторы (https://isocpp.org/wiki/faq/dtors#order-dtors-for-...). Поэтому доступные данные и методы в родительском деструкторе ограничены родительским подобъектом и его родителями.
Родительский деструктор можно сделать тривиальным ~Parent() = default (ничего не делать) или чистым виртуальным virtual ~Parent() = 0 (не определен). Только во втором случае невозможно создавать объекты типа "Parent".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы