Не используйте аргументы по-умолчанию в виртуальных функциях

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

Пример:

#include <iostream>

struct Base
{
    virtual int foo(int value = 14) { return value; }
};

struct Derived : public Base
{
    int foo(int value = 42) override { return value; }
};

int main()
{
    std::unique_ptr<Base> p = std::make_unique<Derived>();
    std::cout << p->foo() << std::endl;
}

Можно ожидать, что на экран будет выведено 42, но выводится 14.

Рекомендуется использовать идиому NVI для таких аргументов, в качестве решения проблемы.