J'ai une classe de base avec une fonction virtuelle et je souhaite remplacer cette fonction dans une classe dérivée. Existe-t-il un moyen de faire en sorte que le compilateur vérifie si la fonction que j'ai déclarée dans la classe dérivée remplace réellement une fonction dans la classe de base? Je voudrais ajouter une macro ou quelque chose qui garantit que je n'ai pas accidentellement déclaré une nouvelle fonction, au lieu de remplacer l'ancienne.
Prenons cet exemple:
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);
}
Ici parent::handle_event()
est appelée à la place de child::handle_event()
, car la méthode de l'enfant manque la const
déclaration et déclare donc une nouvelle méthode. Cela peut également être une faute de frappe dans le nom de la fonction ou une différence mineure dans les types de paramètres. Cela peut également se produire facilement si l'interface de la classe de base change et que quelque part une classe dérivée n'a pas été mise à jour pour refléter le changement.
Existe-t-il un moyen d'éviter ce problème, puis-je dire au compilateur ou à un autre outil de vérifier cela pour moi? Des indicateurs de compilation utiles (de préférence pour g ++)? Comment évitez-vous ces problèmes?