Назад к вопросам
Junior — Middle
85
В чем заключается специфика вызова виртуальных методов внутри конструктора класса?
Ответ от нейросети
sobes.tech AI
При вызове виртуальных методов внутри конструктора класса в C++ происходит особенность: виртуальные вызовы не работают как обычно. Во время выполнения конструктора объекта виртуальная таблица (vtable) указывает на методы текущего класса, а не на переопределённые в производных классах.
Это значит, что если внутри конструктора базового класса вызвать виртуальный метод, будет вызван именно метод базового класса, даже если в производном классе он переопределён. Это сделано для предотвращения вызова методов, которые могут зависеть от ещё не инициализированной части объекта.
Пример:
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; }
};
int main() {
Derived d; // Выведет "Base::foo", а не "Derived::foo"
}
Таким образом, вызов виртуальных методов в конструкторах и деструкторах всегда происходит в контексте текущего класса, а не производного.