编译器:GCC
在下面的代码中,所有3个Foo()的签名都是Foo(bool b)
,但有人更新了代码并忘记更改DeriveB::Foo
。这通过编译。我们怎样才能防止这种错误呢?
class Base {
virtual Foo(bool b, int i);
}
class DerivedA : public Base {
Foo(bool b, int i);
}
class DerivedB : public Base {
Foo(bool b);
}
答案 0 :(得分:1)
override
说明符可能就是您想要的。如果您在派生类的Foo
声明中使用它,那么DerivedB::Foo
会出现错误,因为它有不同的签名。
class Base {
virtual Foo(bool b, int i);
}
class DerivedA : public Base {
Foo(bool b, int i) override; // would be fine
}
class DerivedB : public Base {
Foo(bool b) override; // gives an error
}
如果派生类中的函数与基类中的函数具有不同的签名,或者基类中的函数未声明virtual
,则会出错。
没有办法强迫人们在派生类中使用覆盖说明符,所以你仍然要记得使用它。但是在更改功能签名时至少可能会发现错误。有关覆盖外观here的更多信息。
答案 1 :(得分:1)
在C ++ 11中,您可以使用override
说明符,我相信它也是MSVC对C ++ 03代码的扩展。
如果您正在使用g ++或clang,那么将-Woverloaded-virtual
传递给编译器就是我想到的。对于上面的示例,g ++报告:
so_virt.cc:2:16: warning: ‘virtual void Base::Foo(bool, int)’ was hidden [-Woverloaded-virtual]
virtual void Foo(bool b, int i);
^
so_virt.cc:10:8: warning: by ‘void DerivedB::Foo(bool)’ [-Woverloaded-virtual]
void Foo(bool b);
答案 2 :(得分:0)
class Base {
virtual Foo(bool b, int i) = 0;
}
class DerivedA : public Base {
Foo(bool b, int i);
}
class DerivedB : public Base {
Foo(bool b);
}
请注意我将=0
添加到virtual Foo(bool b, int i) = 0