Каква е спецификата на извикването на виртуални методи вътре в конструктора на клас?
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"
}
Затова извикванията на виртуални методи в конструкторите и деструкторите винаги се случват в контекста на текущия клас, а не на наследения.