Sobes.tech
Назад к вопросам
Junior — Middle
91

В чем особенность вызова виртуальной функции из деструктора в C++?

Ответ от нейросети

sobes.tech AI

При вызове виртуальной функции из деструктора в C++ происходит вызов версии функции, соответствующей текущему уровню разрушения объекта. То есть, если деструктор базового класса вызывает виртуальную функцию, то вызовется версия этой функции из базового класса, а не из производного.

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

Пример:

struct Base {
    virtual ~Base() { foo(); }
    virtual void foo() { std::cout << "Base::foo" << std::endl; }
};
struct Derived : Base {
    ~Derived() override { }
    void foo() override { std::cout << "Derived::foo" << std::endl; }
};

int main() {
    Base* b = new Derived();
    delete b; // В деструкторе Base вызовется Base::foo, а не Derived::foo
}