Sobes.tech
Junior — Middle

Welke gevolgen kunnen er optreden bij het aanroepen van een virtuele functie binnen een destructor van een object?

sobes.tech AI

Antwoord van 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

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