Удаление производного объекта через базовый указатель без виртуального деструктора даёт неопределённое поведение. Это не гарантированное исключение, которое можно надёжно поймать.
Сгенерировать ситуацию, вызывающую неопределённое поведение при удалении через базовый указатель
Удаление производного объекта через базовый указатель без виртуального деструктора даёт неопределённое поведение. Это не гарантированное исключение, которое можно надёжно поймать.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо показать пример, когда объект производного класса удаляется через указатель на абстрактный базовый класс, у которого деструктор не объявлен виртуальным. В таком случае происходит неопределённое поведение или выбрасывается исключение.
struct A {
virtual void foo() = 0;
// деструктор не виртуальный
};
struct B : A {
~B(); // должен быть вызван корректно
};
Ответ
Удаление производного объекта через базовый указатель без виртуального деструктора даёт неопределённое поведение. Это не гарантированное исключение, которое можно надёжно поймать.
Пример некорректного кода:
struct A {
virtual void foo() = 0;
};
struct B : A {
void foo() override {}
~B() = default;
};
void bad_example() {
A* ptr = new B;
delete ptr; // Неопределённое поведение.
}
B обязан реализовать foo, иначе создать его вообще нельзя. Исправление — virtual ~A() = default;. После этого удаление через A* корректно разрушит B и базовую часть. Пример не следует запускать в расчёте на конкретный результат.