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

Какие последствия могут возникнуть при вызове виртуальной функции внутри деструктора объекта?

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

sobes.tech AI

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

Последствия:

  • Если виртуальная функция переопределена в производном классе, то вызов внутри деструктора базового класса не вызовет эту переопределённую версию, а вызовет базовую.
  • Это может привести к неожиданному поведению или ошибкам, если функция зависит от состояния производного класса, которое уже разрушено.

Пример:

#include <iostream>

struct Base {
    virtual ~Base() {
        foo(); // вызов виртуальной функции
    }
    virtual void foo() { std::cout << "Base::foo" << std::endl; }
};

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

int main() {
    Base* obj = new Derived();
    delete obj; // вызовет Base::~Base(), внутри которого foo() вызовет Base::foo
}

Вывод будет:

Derived destructor
Base::foo

Таким образом, вызов виртуальной функции в деструкторе не вызывает переопределённую версию из производного класса.