Тебе нужен виртуальный деструктор всякий раз, когда в твоём классе есть хотя бы одна виртуальная функция. Это фундаментальное правило в объектно-ориентированном проектировании C++.
Если ты удаляешь динамический объект через указатель на базовый класс, невиртуальный деструктор вызовет только деструктор базового класса, а не деструктор производного класса. Это приводит к:
Если сделать деструктор virtual, то будет вызван правильный деструктор в зависимости от фактического типа объекта, а не от типа указателя, через который ты удаляешь объект.
class Base {
public:
virtual ~Base() {} // виртуальный деструктор
virtual void doSomething() = 0;
};
class Derived : public Base {
public:
~Derived() { /* очистка */ }
void doSomething() override {}
};
// Безопасное удаление - вызывает Derived::~Derived() затем Base::~Base()
Base* ptr = new Derived();
delete ptr;
Правило простое: если в твоём классе есть виртуальные функции, добавь виртуальный деструктор. Это обеспечит корректную полиморфную очистку и предотвратит утечки ресурсов в иерархиях наследования.
Виртуальный деструктор требуется только для абстрактных базовых классов, а не для конкретных классов с виртуальными функциями.
Новый — ещё не проверен сообществом
Вы