繁体   English   中英

覆盖非虚拟功能

[英]override on non-virtual functions

它说的是C ++ 11 FDIS

如果使用virt-specifier覆盖标记了虚函数并且不覆盖基类的成员函数,则程序格式错误。 [示例:

 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不会被标记为虚拟怎么办? 程序格式错误吗? 还是被override然后被忽略`。 我在标准文本中找不到这种情况的任何处理。

更新1/2 (合并)我将请求转发给C ++编辑器以调查问题。 感谢约翰内斯向我指出这一点。

  • “无效f(long)覆盖”不会覆盖函数,特别是。 没有虚拟的,
  • 因此它不是虚拟的
  • 因此,文本“如果虚拟功能标记有...”不适用
  • 因此,该示例与文本不匹配。

但是通过意识到这一点,我发现无法满足“ override”上下文关键字的意图:如果函数名称中的错字或错误的参数类型确实使函数本身不是虚拟的,那么该标准的文本将永远不适用- -而“替代”则变得无用。

最好的解决方案可能是

  • 将“虚拟”放在示例功能的前面

如果B::f不会被标记为虚拟怎么办? 程序格式错误吗?

是的。 因为为了覆盖某些内容,所以某些内容必须是虚拟的。 否则,它不会被覆盖 ,而是会被隐藏 因此,肯定的答案来自您问题的引文。

如果B:f是非虚拟的,则两个 D:f函数都将格式错误。

是的,将override添加到任何非虚拟函数时,程序格式不正确。

通常,具有不同签名(重载)的功能与具有不同名称的功能一样。 在规格中给出的例子并不意味着暗示函数名影响override 它旨在显示override旨在防止的常见错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM