Junior — Middle
Lors de la suppression d'un objet via un pointeur vers la classe de base avec un destructeur virtuel défini, comment sont appelés les destructeurs dans la chaîne d'héritage?
sobes.tech IA
Réponse de l'IA
Если у базового класса объявлен виртуальный деструктор, то при удалении объекта через указатель на базовый класс вызывается цепочка деструкторов начиная с самого производного класса и вверх по иерархии наследования до базового. Это гарантирует корректное освобождение ресурсов, выделенных в производных классах.
Пример:
class Base {
public:
virtual ~Base() { std::cout << "Base destructor\n"; }
};
class Derived : public Base {
public:
~Derived() override { std::cout << "Derived destructor\n"; }
};
int main() {
Base* ptr = new Derived();
delete ptr; // Вызовет сначала Derived::~Derived(), затем Base::~Base()
}
Без виртуального деструктора вызов delete через указатель базового класса приведет к неопределённому поведению и, как правило, не вызовет деструктор производного класса.