我正在阅读有关继承的文档。 https://www10.informatik.uni-erlangen.de/en/Teaching/Courses/SS2011/CPP/kellermann.pdf 在那里,我读了一行
我想知道为什么我们不应该覆盖非虚函数?
答案 0 :(得分:2)
#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 ++的规则一样 - 它更多的是经验法则而不是诫命,因为这可能偶尔会有用。