虚函数参数的默认值应与基类中声明的一致
6.5.4 ID_inconsistentDefaultArgument
虚函数参数的默认值不受多态规则控制,通过基类指针或引用调用派生类重写的虚函数时,默认值仍采用基类中的定义。
示例:
class A {
public:
virtual int foo(int i = 0) {
return i;
}
};
class B: public A {
public:
int foo(int i = 1) override { // Non-compliant
return i + 1;
}
};
A* p = new B;
cout << p->foo() << '\n'; // What is output?
输出 1,这种虚函数的非多态行为是非常令人困惑的。
相关
依据
ISO/IEC 14882:2003 8.3.6(10)
ISO/IEC 14882:2011 8.3.6(10)
ISO/IEC 14882:2017 11.3.6(10)
参考
CWE-628
C++ Core Guidelines C.140
MISRA C++ 2008 8-3-1