Определение вывода программы с наследованием и деструкторами

Определённого вывода нет: 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().

Конкретный эксперимент с исходником может показать одну строку или иной результат, но это не превращает его в правильную программу. Для полиморфного удаления важно свойство базового деструктора, а не отсутствие полей в производном классе.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее