如何强制执行'override'关键字?

时间:2012-11-04 21:46:49

标签: c++ visual-c++ c++11 visual-studio-2012 override

有没有办法在Visual C ++ 2012中强制使用C ++ 11 override关键字?

(即如果我忘了说override,那么我想收到警告/错误。)

2 个答案:

答案 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的情况下从基类中隐藏了一个函数,那就是错误。

但大部分提案已被删除,只保留finaloverride个功能,作为“具有特殊含义的标识符”而不是属性。

答案 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

要启用这两个警告,您可以使用以下选项之一:

  1. 在项目设置中将警告级别设置为4,然后禁用您不想要的警告。这是我的首选方式。要禁用不需要的4级警告,请转到项目设置&gt; C / C ++&gt;高级,然后在“禁用特定警告”框中输入警告编号。
  2. 使用代码启用以上两个警告。

    #pragma warning(default:4263)
    #pragma warning(default:4266)
    
  3. 在项目设置中启用以上两个警告&gt; C / C ++&gt;命令行然后输入/ w34263 / w34266。这里/ wNxxxx选项意味着在级别N中启用xxxx警告(N = 3是默认级别)。你也可以使用/ wdNxxxx来禁用N级的xxxx警告。

  4. <强> GCC

    GCC 5.1+添加了新的警告建议覆盖,您可以将其作为命令行选项-Wsuggest-override传递。

    <强>锵

    Clang 3.5+有-Winconsistent-missing-override但是这仅检测基类使用覆盖而父级不覆盖的情况。你可能也想看一下clang-tidy工具。