Sobes.tech
Back to questions
Junior — Middle
87

В чем заключается специфика вызова виртуальных методов внутри конструктора класса?

Answer from AI

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"
}

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