如何执行“覆盖”关键字?
有没有什么办法强制在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
的情况下隐藏了一个来自基类的函数,那么就是一个错误。
但是大部分build议都被放弃了,只有final
和override
function被保留下来,作为“具有特殊含义的标识符”而不是属性。
有很less的方法可以在VC ++中做到这一点,以及与GCC同样的方式。
VC ++
以下是VC ++中的相关警告号码:
C4263 (level 4) 'function': member function does not override any base class virtual member function C4266 (level 4) 'function': no override available for virtual member function from base 'type'; function is hidden
要启用这两个警告,您可以使用以下选项之一:
- 在项目设置中将警告级别设置为4,然后禁用不需要的警告。 这是我最喜欢的方式。 要禁用不需要的4级警告,请转至项目设置> C / C ++>高级,然后在“禁用特定警告”框中input警告号码。
-
使用代码启用以上两个警告。
#pragma warning(default:4263) #pragma warning(default:4266)
-
在项目设置> C / C ++>命令行中启用以上两个警告,然后input/ w34263 / w34266。 这里/ wNxxxx选项表示在N级启用xxxx警告(N = 3是默认级别)。 您还可以执行/ wdNxxxx,禁用级别为N的xxxx警告。
GCC
GCC 5.1+增加了新的警告build议覆盖,你可以通过命令行选项-Wsuggest-override
。
铛
-Winconsistent-missing-override
3.5+具有-Winconsistent-missing-override
但是这只能检测的情况下,如果基类使用覆盖,但父母没有。 你也许还想看一下叮当作响的工具。