要求虚函数覆盖使用 override 关键字

新手上路,请多包涵

C++11 添加了 override 以确保您编写的打算覆盖基类虚函数的成员函数实际执行(或不会编译)。

但是在大型对象层次结构中,有时您可能会意外地编写一个覆盖基类虚拟的成员函数,而您并不打算这样做!例如:

 struct A {
    virtual void foo() { }  // because obviously every class has foo().
};

struct B : A { ... };

class C : B {
private:
    void foo() {
        // was intended to be a private function local to C
        // not intended to override A::foo(), but now does
    }
};

是否有一些编译器标志/扩展至少会在 C::foo 上发出警告?为了可读性和正确性,我只想强制所有覆盖都使用 override

原文由 Barry 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 870
2 个回答

看起来 GCC 5.1 版本添加了我正在寻找的 警告

-Wsuggest-override

警告重写未用 override 关键字标记的虚函数。

使用 -Wsuggest-override -Werror=suggest-override 编译将强制所有覆盖使用 override

原文由 Barry 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以做两件事。

首先,Clang 3.5 及更高版本有 -Winconsistent-missing-override 警告(由 -Wall 触发)。这不适用于您的示例,但前提是您将 void foo() override {} 添加到 class B 而不是在 class C 中。您真正想要的是 -Wmissing-override ,以找到所有缺失的 override ,而不仅仅是那些不一致缺失的。目前没有提供,但你可能会在 Clang 邮件列表上抱怨,他们可能会添加它。

其次,您使用 Howard Hinnant 的技巧final 临时 添加到基类成员函数中并重新编译。然后编译器将定位所有试图覆盖 virtual 基成员函数的进一步派生类。然后,您可以修复丢失的那些。当您的类层次结构扩展时,这需要更多的工作并且需要经常重新检查。

原文由 TemplateRex 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题