C ++

它说的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然后被忽略。 我在std文本中找不到任何这种情况的处理。

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

  • “void f(long)override”不会覆盖函数,特别是。 没有虚拟的,
  • 因此它不是虚拟的
  • 因此文本“如果虚拟功能标有...”不适用
  • 因此该示例与文本不匹配。
  • 但通过实现这一点,我发现,无法满足“覆盖”上下文关键字的意图:如果函数名称中的拼写错误或错误的参数类型确实使函数本身不是虚拟的,则标准文本将不会应用 - - 和“覆盖”是无用的。

    最好的解决方案可能是

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

  • 如果B::f不会被标记为虚拟? 那么该计划是否构成不良?

    是的。 因为为了覆盖某些东西,这个东西必须是虚拟的。 否则它不是压倒性的 ,它隐藏着 。 所以,你的问题中引用的正面答案如下。


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


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

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

    链接地址: http://www.djcxy.com/p/89617.html

    上一篇: c++

    下一篇: Angularjs SEO: is making html snapshots required anymore?