Les fonctions virtuelles existent en C++ depuis le début comme moyen de polymorphisme dynamique. Cependant, il n'y avait pas auparavant de mécanisme syntaxique obligeant le compilateur à vérifier la validité de la redéfinition des fonctions virtuelles dans les classes dérivées. Avec l'arrivée de C++11, le mot-clé override est devenu un outil de vérification supplémentaire par le compilateur.
Sans override, le compilateur ne garantit pas que la fonction redéfinit réellement la méthode de la classe de base. Des erreurs dans la signature (par exemple, type ou const incorrect) entraînent la création d'une nouvelle fonction dans la classe dérivée («masquage»), ce qui casse le polymorphisme et complique le débogage.
Utiliser override lors de la déclaration d'une fonction virtuelle dans une classe dérivée permet au compilateur de vérifier que la signature correspond exactement à la fonction virtuelle parente, et que la fonction redéfinit réellement la parentale. Dans le cas contraire, la compilation échoue avec une erreur.
Exemple de code :
struct Base { virtual void foo() const {} }; struct Derived : Base { void foo() const override { /* implémentation */ } };
Si dans Derived on écrit void foo() sans const override, le compilateur renverra une erreur.
Caractéristiques clés :
Peut-on laisser une fonction virtuelle avec le mot-clé 'override', mais sans le mot clé 'virtual' ?
Oui, override implique que la fonction est virtuelle. Spécifier virtual avec override est redondant, mais pas interdit.
Peut-il y avoir une erreur si la fonction se distingue seulement par le modificateur const ou le qualificateur de référence (par exemple, & ou &&) ?
Oui, toute différence dans la signature, y compris en ce qui concerne const/références, casse la redéfinition. Par exemple, void foo() override ne redéfinit pas void foo() const, et le compilateur, grâce à override, le signalera.
Peut-on appliquer 'override' aux fonctions statiques ou aux constructeurs ?
Non. override est uniquement pour les fonctions virtuelles, il ne peut pas être appliqué aux fonctions statiques, constructeurs, destructeurs (s'ils ne sont pas virtuels).
Dans un grand projet, une classe dérivée a une faute de frappe dans la signature de la fonction : la fonction n'est en fait pas un override, mais le développeur le pense autrement, le polymorphisme ne fonctionne pas comme prévu.
Avantages :
Inconvénients :
Dans toutes les classes dérivées, override est utilisé, les tests détectent les erreurs dès l'étape de compilation.
Avantages :
Inconvénients :