它说的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
没有被标记为虚拟怎么办?那么程序是否格式不正确?或者override
然后被忽略。我在std文本中找不到任何处理此案例的内容。
更新1/2 (合并)我将请求转发给C ++编辑器以查看事情。感谢 Johannes 向我指出。
但是通过实现这一点我发现,无法满足“覆盖”上下文关键字的意图:如果函数名中的拼写错误或错误的参数类型确实使函数本身非虚拟,那么标准的文本从不适用 - 并且“覆盖”变得无用。
最好的解决方案可能是
答案 0 :(得分:27)
如果
B::f
没有被标记为虚拟怎么办?那个程序是不是形成了吗?
是的,确实如此。因为为了 覆盖 某些内容, 必须 是虚拟的。否则,它不是 覆盖 ,它是 隐藏 。因此,肯定的答案来自你问题中的引用。
答案 1 :(得分:0)
如果B:f
是非虚拟的,那么 D:f
两个函数都会格式不正确。
答案 2 :(得分:0)
是的,当override
添加到任何非虚拟功能时,程序生成错误。
通常,具有不同签名(重载)的函数与具有不同名称的函数不同。 Spec中给出的示例并不意味着函数名称影响override
。它旨在显示override
旨在防止的常见错误。