覆盖非虚函数

tow*_*owi 29 c++ virtual attributes overriding c++11

它说的是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
};
Run Code Online (Sandbox Code Playgroud)

如果B::f没有被标记为虚拟怎么办?那个程序是不是形成了吗?或者override然后被忽略.我在std文本中找不到任何处理此案例的内容.

更新1/2(合并)我将请求转发给C++编辑器以查看事物.谢谢约翰内斯向我指出这一点.

  • "void f(long)override"不会覆盖函数,尤其是 没有虚拟的,
  • 因此它不是虚拟的
  • 因此,文本"如果虚拟功能标有..."不适用
  • 因此该示例与文本不匹配.

但是通过实现这一点,我发现,无法满足"覆盖"上下文关键字的意图:如果函数名称中的拼写错误或错误的参数类型确实使函数本身非虚拟,那么标准的文本永远不会适用 - - 并且"覆盖"变得无用.

最好的解决方案可能是

  • 将"虚拟"放在示例函数前面

Arm*_*yan 29

如果B::f没有被标记为虚拟怎么办?那个程序是不是形成了吗?

是的.因为为了覆盖某些东西,那些东西必须是虚拟的.否则它不会覆盖,它隐藏起来.因此,肯定的答案来自你问题中的引用.

  • 你能提供标准参考吗? (2认同)