为什么在C ++中覆盖是可选的?

时间:2016-03-24 21:46:01

标签: c++ c++11 override

我理解C++ override的目的,但是与其他更高级别的语言相比,它的实现有点困惑,默认情况下需要使用它。

C++11 wiki page将其描述为“声明属性的技术标识符”,但没有详细说明为什么它不仅仅是该语言的关键字。

2 个答案:

答案 0 :(得分:9)

保持与C ++ 03的向后兼容性是可选的。使其成为非可选项会破坏所有代码 *

同样,将override设为关键字会破坏使用名称override的任何代码。

好的,不是字面上所有代码,而是很多代码。

答案 1 :(得分:3)

从技术上讲,C ++ 11在这方面与Java没有太大的不同(这是您提到的“其他更高级语言”之一的典型示例)。 错误 override将是编译错误,就像Java中的错误@Override一样。 缺少 override将不会出现编译错误,就像丢失的@Override不会是Java中的编译错误一样。

我能看到的唯一真正的区别是Java工具传统上有更好的支持来检测丢失的@Override,并且传统上鼓励Java用户将相应的警告视为错误,而C ++编译器一直是到目前为止,为缺少override s添加警告选项非常慢。

但我们到了那里; Clang现在有-Winconsistent-missing-override,而较新的GCC有-Wsuggest-override。您所要做的就是启用这些警告,并将它们视为错误,可以由编译器强制执行,也可以按惯例处理。

至于为什么它不仅仅是一个关键字:向后兼容旧代码。