提问者:小点点

为什么不应该覆盖非虚拟函数


我想知道为什么我们不应该重写非虚拟函数?


共1个答案

匿名用户

#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的每一条规则一样,这更多是一条经验法则,而不是一条戒律,因为这可能偶尔有用。