Не используйте аргументы по-умолчанию в виртуальных функциях
Аргументы по-умолчанию в виртуальных функциях связываются статически, что является причиной неожиданного поведения.
Пример:
#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 для таких аргументов, в качестве решения проблемы.