2012-11-04 53 views
44

在Visual C++ 2012中有没有强制使用C++ 11 override关键字的方法?如何执行“覆盖”关键字?

(即,如果我忘了说override,那么我希望得到一个警告/错误。)

+3

@HansPassant:Visual C++? – Mehrdad

+10

这个问题为什么关闭?有关C++编译器警告的问题是否有问题? (如果答案是“否”,那么这是一个完全有效的答案..) – Mehrdad

+12

@Mehrdad:___我不认为这个问题有什么问题。如果它真的被关闭,应该重新打开。 – sbi

回答

21

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

这个建议是否被再次考虑用于未来版本的标准? – Xeo

+3

@Xeo:如果没有人为此游说,那么它就不会被看到。我个人只是把它放在了笨蛋,例如,基于铿锵声,并强制检查。 –

+0

不*很*回答这个问题(因为虽然它不在C++ 11中,但Visual C++可能仍然有某种警告我不知道),但仍然是很好的信息,谢谢。 +1 – Mehrdad

4

有很少的方法可以在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警告,请转到项目设置> C/C++>高级,然后在禁用特定警告框中输入警告号码。
  2. 使用代码启用上述两个警告。

    #pragma warning(default:4263) 
    #pragma warning(default:4266) 
    
  3. 启用上述项目设置> C/C++>命令行两次警告,然后输入/ w34263/w34266。这里/ wNxxxx选项表示在级别N中启用xxxx警告(N = 3是默认级别)。你也可以做/ wdNxxxx其禁用水平N的XXXX警告

GCC

GCC 5.1及更高版本增加了新的预警提示,覆盖,你可以传递作为命令行选项-Wsuggest-override

锵3.5+有-Winconsistent-missing-override然而,这只能检测情况下,如果基类使用覆盖,但家长不。你也可以看看叮当的工具。

+4

那些VC++警告用于_including_ override,它不适用。问题是要求在_missing_覆盖中发出警告。 – mskfisher