我有一个带有虚函数的基类,我想在派生类中重写该函数。有没有办法让编译器检查我在派生类中声明的函数是否真的覆盖了基类中的函数?我想添加一些宏或其他东西,以确保我没有意外地声明一个新的函数,而不是覆盖旧的。
举个例子:
class parent {
public:
virtual void handle_event(int something) const {
// boring default code
}
};
class child : public parent {
public:
virtual void handle_event(int something) {
// new exciting code
}
};
int main() {
parent *p = new child();
p->handle_event(1);
}
这里调用的是 parent::handle_event()
而不是 child::handle_event()
,因为子方法缺少 const
声明,因此声明了一个新方法。这也可能是函数名中的一个输入错误,或者参数类型中的一些细微差别。如果基类的接口发生变化,并且某些派生类没有被更新以反映变化,那么这种情况也很容易发生。
有没有什么办法可以避免这个问题,我可以告诉编译器或其他工具来检查这个问题吗?任何有用的编译器标志(最好是 g + +) ?如何避免这些问题?