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