覆盖非虚函数

override on non-virtual functions

本文关键字:函数 覆盖      更新时间:2023-10-16

c++ 11 FDIS它说

如果虚函数带有virt-specifier override标记,并且没有覆盖的成员函数作为基类,程序是病态的。(例子:

struct B {
    virtual void f(int);
};
struct D : B {
    void f(long) override; // error: wrong signature overriding B::f
    void f(int) override; // OK
};

如果B::f没有被标记为virtual会怎样?程序是病态的吗?还是说override可以忽略?我在std文本中找不到对这种情况的任何处理。

Update 1/2(合并)我向c++编辑转发了一个请求来查看事情。谢谢Johannes向我指出这一点。

  • "void f(long) override"不重写函数,特别是不重写虚函数,
  • 因此它不是虚拟的
  • 因此,文本"If a virtual function is marked with…"不适用
  • 因此该示例不匹配文本。

但是通过意识到这一点,我发现,"override"上下文关键字的意图不能满足:如果函数名中的错字或错误的参数类型确实使函数本身非虚,那么标准的文本永远不会应用-并且"override"变得无用。

最好的解决方案可能是

  • 将"virtual"放在示例函数的前面

如果B::f没有被标记为virtual会怎样?那么,这个程序格式不正吗?

是的,它是。因为为了覆盖某个东西,该东西必须是虚的。否则它就不是覆盖,它是隐藏。所以,肯定的答案来自你问题中的引用。

如果B:f是非虚函数,则两个 D:f函数都是病态函数。

是的,当override被添加到任何非虚函数中时,程序是病态的。

一般来说,具有不同签名(重载)的函数与具有不同名称的函数一样不同。规范中给出的示例并不意味着函数名影响override。这是为了显示override旨在防止的常见错误。