Junior — Middle
Pašalinus objektą per nuorodą į bazinę klasę su apibrėžtu virtualiu destruktoriumi, kaip kviečiami destruktoriai paveldėjimo grandinėje?
sobes.tech AI
Atsakymas iš 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 через указатель базового класса приведет к неопределённому поведению и, как правило, не вызовет деструктор производного класса.