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