有没有办法在Visual C ++ 2012中强制使用C ++ 11 override
关键字?
(即如果我忘了说override
,那么我想收到警告/错误。)
答案 0 :(得分: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
的情况下从基类中隐藏了一个函数,那就是错误。
但大部分提案已被删除,只保留final
和override
个功能,作为“具有特殊含义的标识符”而不是属性。
答案 1 :(得分:7)
在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
要启用这两个警告,您可以使用以下选项之一:
使用代码启用以上两个警告。
#pragma warning(default:4263)
#pragma warning(default:4266)
在项目设置中启用以上两个警告&gt; C / C ++&gt;命令行然后输入/ w34263 / w34266。这里/ wNxxxx选项意味着在级别N中启用xxxx警告(N = 3是默认级别)。你也可以使用/ wdNxxxx来禁用N级的xxxx警告。
<强> GCC 强>
GCC 5.1+添加了新的警告建议覆盖,您可以将其作为命令行选项-Wsuggest-override
传递。
<强>锵强>
Clang 3.5+有-Winconsistent-missing-override
但是这仅检测基类使用覆盖而父级不覆盖的情况。你可能也想看一下clang-tidy工具。