我正在阅读这篇有关继承的文档。 https://www10.informatik.uni-erlangen.de/en/Teaching/Courses/SS2011/CPP/kellermann.pdf 我在那里读到一行
我想知道为什么我们不应该重写非虚函数?
最佳答案
#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/