Назад к вопросам
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
Таким образом, вызов виртуальной функции в деструкторе не вызывает переопределённую версию из производного класса.