为什么在C++中override是可选的
Why is override optional in C++?
我理解C++重写的目的,但与其他高级语言相比,它的实现有点混乱,在其他高级语言中,默认情况下需要使用它。
C++11 wiki页面将其描述为"声明符属性的技术标识符",但没有详细说明为什么它不仅仅是该语言的关键字。
与C++03保持向后兼容性是可选的。如果将其设为非可选,则会破坏所有代码*。
类似地,将override
作为关键字会破坏任何使用名称override
的代码。
好的,不是所有代码,而是很多。
从技术上讲,C++11的行为与这里的Java没有太大区别(这是您提到的"其他高级语言"之一的典型示例)。错误的override
将是编译错误,就像Java中错误的@Override
一样。缺少override
不会是编译错误,就像缺少@Override
不会是Java中的编译错误一样。
我能看到的唯一真正的区别是,Java工具传统上有更好的支持来检测丢失的@Override
,并且传统上鼓励Java用户将相应的警告视为错误,而C++编译器迄今为止在为丢失的override
s添加警告选项方面相当缓慢。
但我们正在实现这一目标;Clang现在有-Winconsistent-missing-override
,较新的GC有-Wsuggest-override
。您所要做的就是启用这些警告并将其视为错误,要么由编译器强制执行,要么只是按照约定执行。
至于为什么它不仅仅是一个关键词:与旧代码的向后兼容性。
相关文章:
- 如何确保C++函数在定义之前声明(如override关键字)
- C++类:virtual和override,或者两者都没有
- 如何在 CMake 中"override"文件的按扩展名类型
- 使用<<自有函数的运算符来"override" cout
- 为什么必须将"virtual"放入基类中,而不是仅在子类中使用"override"?在C++
- Vtk 图表在 QT 中突破,"no override found for 'vtkContextDevice2D"
- 原型 C++ 实现 - "marked ‘override’, but does not override"错误
- 使用 c'ctor、d'ctor 和 override
- 为什么"override/final"需要放在函数声明符之后?
- 需要"override"案例时重叠模板部分专用化:如何避免错误?
- 'override'关键字只是对被覆盖的虚拟方法的检查吗?
- Override QQuickImageProvider requestImage()
- 是否强制使用c++override关键字
- 为什么在C++中override是可选的
- Clang 和派生模板类中的“override”关键字
- "Override"构造函数和调用祖父构造函数
- 为什么"override"在 C++11 的末尾?
- 在托管包装器中"override"本机虚拟方法的最佳方法
- 类的相同成员函数可以用 c++ 中的说明符声明"override & final"吗?
- override-map::直接与lambda函数进行比较