c++ - 为什么不应该重写非虚拟函数

标签 c++

我正在阅读这篇有关继承的文档。 https://www10.informatik.uni-erlangen.de/en/Teaching/Courses/SS2011/CPP/kellermann.pdf 我在那里读到一行 enter image description here

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

最佳答案

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

关于c++ - 为什么不应该重写非虚拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30679818/

相关文章:

c++ - 给一个类访问另一个 C++

c++ - 使用索引指示符初始化 _C++_ 对象数组

c++ - std::this_thread::sleep_for sleep 时间过长

c++ - 将函数指针转换为 void(*)(),然后重新转换为原始类型

C++ chrono 系统时间(以毫秒为单位),时间操作

c++ - Omnet++ (INET) 在运行时创建或出现节点

c++ - 为什么链接器看不到我的函数(定义宏来替代系统日志)?

c++ - 有没有办法映射与 Boost 一起使用的网络驱动器(带凭据)?

c++ - 如何在 Linux 上调试 `SIGTERM`

c++ - 将时间字符串转换为持续时间