【问题标题】:How to enforce the 'override' keyword?如何强制执行“覆盖”关键字?
【发布时间】:2012-10-24 18:25:21
【问题描述】:

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

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

【问题讨论】:

  • 为什么这个问题被关闭了?关于 C++ 编译器警告的问题有问题吗? (如果答案是“否”,那么这毕竟是一个完全有效的答案..)
  • @Mehrdad:我不认为这个问题有什么问题。如果真的关闭了,应该重新打开它。跨度>
  • @sbi:谢谢,很高兴听到这个消息。
  • 具体回答您的问题,不,VC++ 2012 RTM 不包含此类警告(即使默认禁用)。
  • @ildjarn:谢谢,这就是我正在寻找的答案。 :)

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


【解决方案1】:

在 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 传递。

叮当

Clang 3.5+ 有-Winconsistent-missing-override,但是这只检测某些覆盖成员或基类使用override 而其他覆盖成员不使用的情况。您可能还想看看 clang-tidy 工具。

【讨论】:

  • 那些 VC++ 警告适用于 包括 覆盖它不适用的地方。问题是要求对 missing 覆盖发出警告。
  • 如果您在一个被覆盖的函数上使用 override 而不是同一类中的另一个函数,也会触发 Clang 警告。
【解决方案2】:

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 特征,作为“具有特殊含义的标识符”而不是属性。

【讨论】:

  • 是否会再次考虑该提案以用于未来的标准修订?
  • @Xeo:如果没有人为它游说,它就不会被关注。我个人只是将它放入检查器中,例如,基于 clang 并强制检查。
  • Doesn't quite 回答问题(因为虽然它不在 C++11 中,但 Visual C++ 可能仍然有某种我不知道的警告),但仍然是很好的信息,谢谢。 +1
  • clang 3.6 具有 -Winconsistent-missing-override,它已经帮助我捕捉到某些功能正在使用覆盖但其他功能缺失的情况。不如你问的那么好,但它是你在当今编译器中开箱即用的最好的。
  • gcc 5.0 具有 -Wsuggest-override,这正是您所要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2013-12-29
  • 2017-04-06
  • 2017-12-28
相关资源
最近更新 更多