【发布时间】: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