Виртуальный деструктор в C++
Указатель на базу может ссылаться на объект потомка,
созданный через new.
При delete через указатель на базу вызывается
деструктор базы. Если он не помечен virtual,
деструктор потомка не вызовется. Слово virtual
перед деструктором базы включает и деструктор потомка.
Запишем такую базу, выделим Student и освободим память:
#include <iostream>
class User {
public:
virtual ~User() {
std::cout << "user done\n";
}
};
class Student : public User {
public:
~Student() {
std::cout << "student done\n";
}
};
Создадим объект Student и удалим его через указатель базы:
int main() {
User* ptr = new Student();
delete ptr;
return 0;
}
Сделайте базовый класс с виртуальным деструктором,
потомка с собственным деструктором, создайте объект
через new в указателе базы и удалите его -
выведите оба сообщения деструкторов.