Junior — Middle
Wat is het verwachte gedrag bij het aanroepen van een virtuele functie binnen de constructor van een klasse?
sobes.tech AI
Antwoord van 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"
Таким образом, виртуальные вызовы в конструкторах и деструкторах не работают полиморфно.