【问题标题】:override on non-virtual functions覆盖非虚函数
【发布时间】:2011-11-23 17:49:09
【问题描述】:

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

更新 1/2(合并)我向 C++ 编辑转发了一个请求,以调查事情。感谢 Johannes 向我指出这一点。

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

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

最好的解决办法可能是

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

【问题讨论】:

  • B,不是D。B里只有一个
  • 您在更新答案中所做的问题陈述已在 9.2p9 中得到解决(请参阅已接受答案的评论部分)。 9.2p9 禁止对非虚拟函数进行“覆盖”。我看到的唯一问题是示例,只需将“virtual”放在“D”中的函数“f”之前即可解决。
  • @litb:好的。谢谢。再次更新。

标签: c++ attributes overriding virtual c++11


【解决方案1】:

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

是的,是的。因为为了覆盖某物,该某物必须是虚拟的。否则它不是覆盖,而是隐藏。因此,肯定的答案来自您问题中的引用。

【讨论】:

  • 你能提供一个标准的参考吗?
  • 我不同意:我引用的公式没有对“非虚函数”做出任何陈述。只有示例可以。有趣的是void D::f(long); 本身是not virtual,因为它不会覆盖virtual void B::f(int)。因此,引用的文本不适用于D::f(long) 后面添加的override。这就是为什么我感到困惑......
  • @towi:引用说:如果标有 virtual 的函数没有 override... 那么程序是不正确的。术语 override 可以应用于虚函数,因此如果函数,其签名与你的新函数不是虚拟的,那么这个新函数不会覆盖它,因此引用适用
  • 啊等等,我刚刚注意到并注意到@towi 也有这些见解。当然,这个公认答案中的推理是有缺陷的(该段落的规范示例也有缺陷)。 9.2p9 拒绝示例,而不是引用的文本。
  • @Johannes:我不明白你在说什么!我同意,将覆盖 ontp 一个函数并不会使其成为虚拟函数。但我没有说别的。我说过,如果基类中的函数不是虚拟的,那么你就无法覆盖它,这意味着如果你把覆盖这个词放在你认为覆盖基类函数的任何函数上,你会得到一个格式错误的程序
【解决方案2】:

是的,当override 被添加到任何非虚拟函数时,程序是错误的。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 为什么?我引用的文字仅指“垂直功能”。如果B::f 不是虚拟的,则文本不适用。
    • @towi 这段文字真正指的是D::f,而不是B::f。函数D::f 仍然是虚拟的,但尝试覆盖不再是虚拟的函数B::f,因此D::f 的两个函数都是错误的。
    猜你喜欢
    • 2015-04-20
    • 2011-07-28
    • 1970-01-01
    • 2013-10-04
    • 2013-11-13
    • 1970-01-01
    • 2021-09-30
    • 2015-06-17
    • 2015-12-15
    相关资源
    最近更新 更多