Определённого вывода нет: DerivedClass удаляется через BaseClass* с невиртуальным деструктором. Это неопределённое поведение, а не гарантированный вызов только ~BaseClass.
Определение вывода программы с наследованием и деструкторами
Определённого вывода нет: DerivedClass удаляется через BaseClass* с невиртуальным деструктором. Это неопределённое поведение, а не гарантированный вызов только ~BaseClass.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Укажите, какой текст будет напечатан в консоль после выполнения следующей программы.
#include <iostream>
class BaseClass {
public:
~BaseClass() {
std::cout << "Hello from ~BaseClass()" << std::endl;
}
};
class DerivedClass : public BaseClass {
public:
~DerivedClass() {
std::cout << "Hello from ~DerivedClass()" << std::endl;
}
};
int main() {
BaseClass* ptr = new DerivedClass();
delete ptr;
return 0;
}
Ответ
Определённого вывода нет: DerivedClass удаляется через BaseClass* с невиртуальным деструктором. Это неопределённое поведение, а не гарантированный вызов только ~BaseClass.
Нужно сделать деструктор BaseClass виртуальным. Тогда сначала выполнится ~DerivedClass и появится Hello from ~DerivedClass(), затем ~BaseClass и Hello from ~BaseClass().
Конкретный эксперимент с исходником может показать одну строку или иной результат, но это не превращает его в правильную программу. Для полиморфного удаления важно свойство базового деструктора, а не отсутствие полей в производном классе.