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 подскажет развёрнутый ответ в реальном времени.