在Visual C++ 2012中是否有强制使用C++11 override
关键字的方法?
即,如果我忘记使用override
,那么我想要得到一个警告/错误。
在Visual C++ 2012中是否有强制使用C++11 override
关键字的方法?
即,如果我忘记使用override
,那么我想要得到一个警告/错误。
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
,那么将会报错。
但是大多数提案都被放弃了,只保留了final
和override
这两个特性,作为“具有特殊含义的标识符”而不是属性。
A
,这是基于 N2928 中的第二个示例。现在已经修复。 - Jonathan Wakely在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”
为启用这两个警告:
C++ Core Check Class Rules
包含这两个检查器)。GCC 5.1+ 已经加入了新的警告 -Wsuggest-override
,你可以将其作为命令行选项传递。
Clang 3.5+ 有一个 -Winconsistent-missing-override
,但是它只能检测出某些覆盖成员或基类使用了 override
,而其他覆盖成员没有这样做的情况。你可能也想看看 clang-tidy 工具。