Например, это предупреждение C4263 в Microsoft Visual 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 ++)? Как избежать этих проблем?

Ответы на вопрос(8)

Ваш ответ на вопрос