Back to questions
Junior — Middle
90
В чем особенность вызова виртуальной функции из деструктора в C++?
Answer from AI
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
}