Sobes.tech
Junior — Middle

Каква е спецификата на извикването на виртуални методи вътре в конструктора на клас?

sobes.tech AI

Отговор от 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"
}

Затова извикванията на виртуални методи в конструкторите и деструкторите винаги се случват в контекста на текущия клас, а не на наследения.