Mediumvirtualдеструктор
Что такое virtual destructor и когда он нужен?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Virtual destructor нужен, когда объект производного класса может быть удалён через указатель на базовый. Без него вызовется только Base::~Base() — Derived-часть не уничтожится, утечка ресурсов.
struct Base {
virtual void f() {}
virtual ~Base() = default; // ОБЯЗАТЕЛЬНО: класс полиморфный
};
struct Derived : Base {
int* data_ = new int[100];
~Derived() { delete[] data_; }
};
Base* p = new Derived;
delete p; // без virtual ~Base() — data_ утечёт- Правило: если класс имеет хотя бы одну virtual функцию (для polymorphic use) — деструктор должен быть virtual;
- Если класс НЕ полиморфный — virtual destructor бесполезен (overhead, добавляет vtable);
- protected non-virtual destructor — паттерн для mixin’ов: запрещает
deleteчерезBase*.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.