Назад к вопросам
Middle
117
questionbank
Зачем нужен виртуальный деструктор в C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
При удалении объекта базового класса через указатель на базовый класс, который фактически указывает на объект производного класса, виртуальный деструктор гарантирует вызов деструктора производного класса перед вызовом деструктора базового класса. Это необходимо для корректного освобождения ресурсов, выделенных производным классом. Если деструктор базового класса не виртуальный, будет вызван только деструктор базового класса, что приведет к утечке ресурсов.
#include <iostream>
class Base {
public:
Base() { std::cout << "Base Constructor\n"; }
// Виртуальный деструктор
virtual ~Base() { std::cout << "Base Destructor\n"; }
};
class Derived : public Base {
public:
Derived() { std::cout << "Derived Constructor\n"; }
// Обязательно вызывается после деструктора Derived
~Derived() override { std::cout << "Derived Destructor\n"; }
};
int main() {
Base* obj = new Derived(); // Указатель базового класса на объект производного
delete obj; // Вызов виртуального деструктора приводит к вызову ~Derived() и ~Base()
return 0;
}
Без виртуального деструктора вывод был бы таким:
Base Constructor
Derived Constructor
Base Destructor
При наличии виртуального деструктора вывод:
Base Constructor
Derived Constructor
Derived Destructor
Base Destructor