Sobes.tech
Junior — Middle

La eliminare a unui obiect printr-un pointer la clasa de bază cu un destructor virtual definit, cum sunt apelate destructorii în lanțul de moștenire?

sobes.tech AI

Răspuns de la AI

Если у базового класса объявлен виртуальный деструктор, то при удалении объекта через указатель на базовый класс вызывается цепочка деструкторов начиная с самого производного класса и вверх по иерархии наследования до базового. Это гарантирует корректное освобождение ресурсов, выделенных в производных классах.

Пример:

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 через указатель базового класса приведет к неопределённому поведению и, как правило, не вызовет деструктор производного класса.