Назад к вопросам
Junior — Middle
82
Какое поведение ожидается при вызове виртуальной функции внутри конструктора класса?
Ответ от нейросети
sobes.tech AI
При вызове виртуальной функции внутри конструктора (или деструктора) класса в C++ вызывается версия функции, определённая именно в текущем классе, а не в производных.
Это связано с тем, что во время выполнения конструктора объект ещё не считается экземпляром производного класса, поэтому механизм виртуального вызова не переключается на переопределённые версии.
Пример:
class Base {
public:
Base() { foo(); }
virtual void foo() { std::cout << "Base::foo" << std::endl; }
};
class Derived : public Base {
public:
Derived() : Base() {}
void foo() override { std::cout << "Derived::foo" << std::endl; }
};
// При создании Derived объект вызовет Base::foo() в конструкторе Base
Derived d; // Выведет "Base::foo"
Таким образом, виртуальные вызовы в конструкторах и деструкторах не работают полиморфно.