Classes and class hierarchies
C.140
Не предоставляйте разные аргументы по умолчанию для виртуальной функции и переопределяющей функции
Причина
Это может привести к путанице: переопределяющая функция не наследует аргументы по умолчанию.
Пример (плохой)
class Base {
public:
virtual int multiply(int value, int factor = 2) = 0;
virtual ~Base() = default;
};
class Derived : public Base {
public:
int multiply(int value, int factor = 10) override;
};
Derived d;
Base& b = d;
b.multiply(10); // эти два вызова вызовут одну и ту же функцию, но
d.multiply(10); // с разными аргументами и, следовательно, разными результатами
Контроль
Помечать аргументы по умолчанию для виртуальных функций, если они различаются между объявлениями в базовом и производном классе.