派生类不应重新定义与基类相同的非虚函数
6.8.1 ID_nonVirtualOverride
派生类不应重新定义与基类相同的非虚函数,否则与多态机制相矛盾,易造成意料之外的问题。
示例:
struct A {
int foo() const { return 0; }
};
struct B: A {
int foo() const { return 1; } // Non-compliant
};
int bar(A* a) {
return a->foo();
}
int main() {
B b;
return bar(&b); // Problematic
}
如果将 B 类型的指针传入 bar 函数,将执行 A::foo,然而参数实际指向的是 B 类型的对象,但 B::foo 不会被执行,这就形成了逻辑上的矛盾,极易造成意料之外的问题。
参考
Effective C++ item 36