【发布时间】:2015-05-22 14:52:15
【问题描述】:
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。
【问题讨论】:
-
实际上,您的函数将被命名为
GazimpleWidget(Widget& w),显然C::GazimpleWidget(Widget& w)仍然是小部件。当您尝试将C::GazimpleWidget( )缩写为C::GW( )时,您只会遇到此类问题。不要那样做。 -
@MSalters 我不明白这个评论。
-
@Barry:您的简化示例的问题在于
foo具有误导性。具有实名的实函数在无意中发生冲突的可能性要小得多。如果它们的名称相同,则它们应该执行相同的操作,然后覆盖可能不是错误。 -
@MSalters “不太可能……”、“应该……”、“可能不会……”。是的,很明显。问题的全部要点是发生了不太可能的情况,该功能未正确实现,我想在编译时验证这一点。
标签: c++ c++11 gcc overriding virtual