У меня есть базовый класс с виртуальной функцией, и я хочу переопределить эту функцию в производном классе. Есть ли способ заставить компилятор проверить, действительно ли функция, объявленная в производном классе, переопределяет функцию в базовом классе? Я хотел бы добавить какой-нибудь макрос или что-то, что гарантирует, что я случайно не объявил новую функцию, вместо того, чтобы переопределить старую.
Вот пример:
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 ++)? Как избежать этих проблем?