Sobes.tech
Назад к вопросам
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"

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