Добавьте публичный virtual-деструктор базового класса. Тогда delete через BaseClass* вызовет сначала деструктор фактического производного типа, затем деструктор базы.
Внедрение виртуального деструктора в базовый класс
Добавьте публичный virtual-деструктор базового класса. Тогда delete через BaseClass* вызовет сначала деструктор фактического производного типа, затем деструктор базы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Внедрите виртуальный деструктор в родительский тип, чтобы гарантировать корректное освобождение памяти при удалении объектов через указатель базового типа.
struct BaseClass {
// виртуальный деструктор
};
struct DerivedClass : BaseClass {
// ...
};
Ответ
Добавьте публичный virtual-деструктор базового класса. Тогда delete через BaseClass* вызовет сначала деструктор фактического производного типа, затем деструктор базы.
struct BaseClass {
virtual ~BaseClass() = default;
};
struct DerivedClass : BaseClass {
~DerivedClass() override = default;
};
override у производного деструктора полезен как проверка контракта, хотя виртуальность наследуется автоматически. Вместо ручного delete можно хранить объект в unique_ptr<BaseClass>; требование к виртуальному деструктору при таком полиморфном удалении сохраняется. Освобождение собственных полей производного класса выполняется обычным механизмом разрушения.