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