如何强制使用“override”关键字?

64

在Visual C++ 2012中是否有强制使用C++11 override关键字的方法?

即,如果我忘记使用override,那么我想要得到一个警告/错误。


12
为什么这个问题要被关闭?与C++编译器警告相关的问题有什么问题吗?(如果答案是“没有”,那么这也是一个完全合理的答案......) - user541686
13
@Mehrdad: 我认为这个问题没有什么问题。如果它被关闭了,应该重新开放。 - sbi
5
具体回答你的问题,不,VC++ 2012 RTM 没有这样的警告(即使默认情况下已禁用)。 - ildjarn
@ildjarn:谢谢,这就是我想要的答案。 :) - user541686
2个回答

22

C++11几乎包含了你想要的。

最初,override关键字是提案 N2928 的一部分,该提案还包括强制使用它的能力:

class A
{
  virtual void f();
};

class B [[base_check]] : public A
{
    void f();  // error!
};

class C [[base_check]] : public A
{
  void f [[override]] ();  // OK
};

base_check属性可以使重写虚函数时必须使用override关键字,否则会报错。

还有一个hiding属性,用于指示一个函数隐藏了基类中的某个函数。如果使用了base_check并且一个函数隐藏了基类中的某个函数但未使用hiding,那么将会报错。

但是大多数提案都被放弃了,只保留了finaloverride这两个特性,作为“具有特殊含义的标识符”而不是属性。


1
这个提案是否会在未来的标准修订中再次被考虑? - Xeo
3
如果没有人游说,它就不会被关注。我个人会把它放到一个检查器中,例如基于clang,并使检查成为强制性的。 - Dietmar Kühl
@BenVoigt,应该是 A,这是基于 N2928 中的第二个示例。现在已经修复。 - Jonathan Wakely
8
clang 3.6有一个叫作-Winconsistent-missing-override的功能,它已经帮助我发现一些函数使用了override,但另一些函数却没有。虽然不如您要求的那么好,但它是当今编译器中最好的开箱即用的功能。 - Sergio Martins
14
gcc 5.0有一个-Wsuggest-override选项,这正是您所需要的。 - mic_e
显示剩余3条评论

16

在VC++中有几种方法可以做到这一点,在GCC中也有等效的方法。

VC++

以下是使用代码质量CppCoreCheck在VC++中相关的警告编号:

[C26435][2] : “Function should specify exactly one of ‘virtual’, ‘override’, or ‘final’.”
[C26433][1] : “Function should be marked with override”
为启用这两个警告:
  1. 打开项目的“属性页”对话框。
  2. 选择“配置属性”>“代码分析”属性页。
  3. 设置“启用构建时代码分析”和“启用 Microsoft 代码分析”属性。
  4. 选择“配置属性”>“代码分析”>“Microsoft”属性页。
  5. 设置活动规则(例如:C++ Core Check Class Rules包含这两个检查器)。
GCC

GCC 5.1+ 已经加入了新的警告 -Wsuggest-override,你可以将其作为命令行选项传递。

Clang

Clang 3.5+ 有一个 -Winconsistent-missing-override,但是它只能检测出某些覆盖成员或基类使用了 override,而其他覆盖成员没有这样做的情况。你可能也想看看 clang-tidy 工具。


12
VC++的警告是因为在不适用override的地方包含了它。该问题要求对缺少override的情况进行警告。 - mskfisher
而且,如果您在同一类中对一个被覆盖的函数使用override,但没有对另一个函数使用,则Clang警告也会触发。 - rubenvb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接