#include <iostream>
class Base{
public:
void foo() const { std::cout << "Basic foo()" << std::endl; }
virtual void bar() const { std::cout << "Basic bar()" << std::endl; }
};
class Derived
: public Base
{
public:
void foo() const { std::cout << "Derived foo()" << std::endl; }
virtual void bar() const override { std::cout << "Derived bar()" << std::endl; }
};
int main(){
Derived obj;
Base& interface = obj;
interface.foo(); //"Basic foo()"
interface.bar(); //"Derived bar()"
}
覆盖非虚拟成员可能会产生意想不到的结果,很难跟踪。即使你知道自己在做什么,你通常也不是唯一一个从事项目的人,这种代码也不是惯用的。类层次结构通常用于动态多态,当您覆盖多态对象的行为时,您希望它在强制转换为基本时表现相应。
正如适用于C的每一条规则一样,这更多是一条经验法则,而不是一条戒律,因为这可能偶尔有用。