Вызов виртуальных функций в конструкторах и деструкторах

Избегайте вызовы виртуальные функций в конструкторах и деструкторах. В состоянии создания или уничтожения объекта не задействуется механизм вызова виртуальных функций, и происходит вызов обычных функций, что может не соответствовать ожидаемому результату.

Пример:

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