覆盖非虚函数
override on non-virtual functions
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
没有被标记为virtual会怎样?程序是病态的吗?还是说override
可以忽略?我在std文本中找不到对这种情况的任何处理。
Update 1/2(合并)我向c++编辑转发了一个请求来查看事情。谢谢Johannes向我指出这一点。
- "void f(long) override"不重写函数,特别是不重写虚函数,
- 因此它不是虚拟的
- 因此,文本"If a virtual function is marked with…"不适用
- 因此该示例不匹配文本。
但是通过意识到这一点,我发现,"override"上下文关键字的意图不能满足:如果函数名中的错字或错误的参数类型确实使函数本身非虚,那么标准的文本永远不会应用-并且"override"变得无用。
最好的解决方案可能是
- 将"virtual"放在示例函数的前面
如果
B::f
没有被标记为virtual会怎样?那么,这个程序格式不正吗?
是的,它是。因为为了覆盖某个东西,该东西必须是虚的。否则它就不是覆盖,它是隐藏。所以,肯定的答案来自你问题中的引用。
如果B:f
是非虚函数,则两个 D:f
函数都是病态函数。
是的,当override
被添加到任何非虚函数中时,程序是病态的。
一般来说,具有不同签名(重载)的函数与具有不同名称的函数一样不同。规范中给出的示例并不意味着函数名影响override
。这是为了显示override
旨在防止的常见错误。
相关文章:
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 如何使用用户定义的函数覆盖 C lib 函数,如 _sbrk?
- 函数覆盖有哪些用例?
- 在子类函数覆盖中省略具有默认值的参数
- C++ 成员变量被非成员函数覆盖
- 用现有函数覆盖虚拟函数
- 函数覆盖是否由编译器自动完成
- 结构被库函数覆盖
- 当在Python中定义__str__时,如何将C 的标准全局函数覆盖
- C++类是否解决函数覆盖问题
- 用私有基函数覆盖公共虚拟函数
- 优先级队列中复制构造函数覆盖的值
- 虚拟函数覆盖预期错误
- C++中的函数覆盖无需"虚拟"即可工作
- C++虚拟函数覆盖
- 如何用非虚拟函数覆盖虚拟函数
- 基成员函数的所有重载是否可以被单个模板化成员函数覆盖和转发到
- C++继承函数覆盖
- 纯虚函数覆盖虚函数
- 引用项目的Qt-main()函数覆盖实际项目的main()