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