Вызов виртуальных функций в конструкторах и деструкторах
Избегайте вызовы виртуальные функций в конструкторах и деструкторах. В состоянии создания или уничтожения объекта не задействуется механизм вызова виртуальных функций, и происходит вызов обычных функций, что может не соответствовать ожидаемому результату.
Пример:
class Base {
public:
Base() {
foo(); // Вызовется Base::foo(), а не Derived::foo()
}
virtual ~Base() = default;
virtual void foo() { std::cout << "Base::foo()\n"; }
};
class Derived : public Base {
public:
Derived() : Base() {}
void foo() override { std::cout << "Derived::foo()\n"; }
};
int main() {
Derived d; // Выведет "Base::foo()", а не "Derived::foo()"
}