覆盖非虚函数

时间:2011-09-23 14:31:03

标签: c++ attributes override virtual 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
};

如果B::f没有被标记为虚拟怎么办?那么程序是否格式不正确?或者override然后被忽略。我在std文本中找不到任何处理此案例的内容。

更新1/2 (合并)我将请求转发给C ++编辑器以查看事情。感谢 Johannes 向我指出。

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

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

最好的解决方案可能是

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

3 个答案:

答案 0 :(得分:27)

  

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

是的,确实如此。因为为了 覆盖 某些内容, 必须 是虚拟的。否则,它不是 覆盖 ,它是 隐藏 。因此,肯定的答案来自你问题中的引用。

答案 1 :(得分:0)

如果B:f是非虚拟的,那么 D:f两个函数都会格式不正确。

答案 2 :(得分:0)

是的,当override添加到任何非虚拟功能时,程序生成错误。

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

相关问题