Pour autant que je sache, l'introduction du override
mot - clé en C ++ 11 n'est rien de plus qu'une vérification pour s'assurer que la fonction en cours d'implémentation est l' override
ingénierie d'une virtual
fonction dans la classe de base.
Est-ce que c'est ça?
Réponses:
Voilà bien l'idée. Le fait est que vous êtes explicite sur ce que vous voulez dire, afin qu'une erreur par ailleurs silencieuse puisse être diagnostiquée:
Le code ci-dessus se compile, mais n'est pas ce que vous avez pu vouloir dire (notez le manquant
const
). Si vous dites à la place,virtual int foo() override
vous obtiendrez une erreur de compilation que votre fonction ne remplace en fait rien.la source
override
fonctionnalité "corrige" cela; vous devez vous rappeler de l'utiliser, tout comme vous auriez dû penser à écrire leconst
;)explicit
les définitions de classe ne sont pas entrées dans C ++ 11. Huh.explicit
définition de classe? Je n'en ai jamais entendu parler.override
quand on a l'intention de le faire) est plus probable que de se souvenir des cas d'angle, c'est-à-dire qu'il n'y a pas de généralité dans les fonctions de copie de différents prototypes, seulement des irrégularités comme manquerconst
ou écrire à lachar
placeint
, etc.override
spécificateur est mentionné dans cette réponse , qui est plus futuriste qu'immédiate. La réponse suggère que, gardez leoverride
avec lavirtual
méthode. À l'avenir, lorsque l'on change par erreur la signature, son utilité entre en jeu.Citation de Wikipedia:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
Modifier (en essayant d'améliorer un peu la réponse):
Déclarer une méthode comme "override" signifie que cette méthode est destinée à réécrire une méthode (virtuelle) sur la classe de base. La méthode prioritaire doit avoir la même signature (au moins pour les paramètres d'entrée) que la méthode qu'elle a l'intention de réécrire.
Pourquoi est-ce nécessaire? Eh bien, les deux cas d'erreur courants suivants sont évités:
on tape mal un type dans la nouvelle méthode. Le compilateur, ignorant qu'il a l'intention d'écrire une méthode précédente, l'ajoute simplement à la classe en tant que nouvelle méthode. Le problème est que l'ancienne méthode est toujours là, la nouvelle est ajoutée juste comme une surcharge. Dans ce cas, tous les appels vers l'ancienne méthode fonctionneront comme avant, sans aucun changement de comportement (ce qui aurait été le but même de la réécriture).
on oublie de déclarer la méthode dans la superclasse comme "virtuelle", mais tente toujours de la réécrire dans une sous-classe. Bien que cela soit apparemment accepté, le comportement ne sera pas exactement celui prévu: la méthode n'est pas virtuelle, donc l'accès via des pointeurs vers la superclasse finira par appeler l'ancienne méthode (superclasse ') au lieu de la nouvelle méthode (sous-classe').
L'ajout de "override" dissipe clairement cette ambiguïté: à travers cela, on dit au compilateur que trois choses sont attendues:
Si l'un d'eux est faux, une erreur est signalée.
* remarque: le paramètre de sortie est parfois de type différent mais lié. Lisez à propos des transformations covariantes et contravariantes si vous êtes intéressé.
la source
Un " remplacement " trouvé est utile lorsque quelqu'un met à jour la signature de la méthode virtuelle de la classe de base, comme l'ajout d'un paramètre facultatif, mais oublie de mettre à jour la signature de la méthode de classe dérivée. Dans ce cas, les méthodes entre la base et la classe dérivée ne sont plus des relations polymorphes. Sans la déclaration de remplacement, il est difficile de trouver ce type de bogue.
la source
override
soit un excellent moyen de découvrir de tels problèmes, une bonne couverture des tests unitaires devrait également aider.Oui, c'est vrai. C'est une vérification pour s'assurer que l'on n'essaie pas de passer outre et de le gâcher grâce à une signature bâclée. Voici une page Wiki qui explique cela en détail et a un court exemple illustratif:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
la source
Projet standard C ++ 17
Après avoir parcouru tous les
override
hits du projet standard C ++ 17 N4659 , la seule référence que je peux trouver à l'override
identifiant est:donc je pense que faire exploser de mauvais programmes est en fait le seul effet.
la source