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

Meh*_*dad 50 c++ overriding visual-c++ c++11 visual-studio-2012

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

(即如果我忘记说override,那么我想得到一个警告/错误.)

Jon*_*ely 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
};
Run Code Online (Sandbox Code Playgroud)

base_check属性会在不使用override关键字的情况下覆盖虚函数.

还有一个hiding属性表示函数隐藏了基类中的函数.如果base_check使用并且函数隐藏了一个基类而不使用hiding它是一个错误.

但大部分提案被删除,只保留了finaloverride特征,作为"具有特殊含义的标识符"而不是属性.

  • gcc 5.0有-Wsuggest-override,这正是你所要求的. (13认同)
  • clang 3.6具有-Winconsistent-missing-override,它已经帮助我捕获了一些函数使用覆盖的情况,但其他函数却丢失了.不如你问的那么好,但它是你今天编译器中开箱即用的最好的. (8认同)
  • @Xeo:如果没有人在游说,那就不会被人看.我个人只是把它放到achecker中,例如,基于clang并强制检查. (3认同)

Shi*_*hah 9

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
Run Code Online (Sandbox Code Playgroud)

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

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

    #pragma warning(default:4263)
    #pragma warning(default:4266)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在项目设置> C/C++>命令行中启用以上两个警告,然后输入/ w34263/w34266.这里/ wNxxxx选项意味着在级别N中启用xxxx警告(N = 3是默认级别).您还可以执行/ wdNxxxx,它会禁用级别N中的xxxx警告.

GCC

GCC 5.1+添加了新警告suggest-override,您可以将其作为命令行选项传递-Wsuggest-override.

-Winconsistent-missing-override然而,Clang 3.5+ 只检测基类使用覆盖而父类不覆盖的情况.你可能也想看看clang-tidy工具.

  • 那些VC++警告用于_including_ override,它不适用.问题是要求_missing_覆盖警告. (9认同)