Le C++ 11 FDIS dit-il
Si une fonction virtuelle est marquée avec le remplacement par virt-specifier et ne remplace pas une fonction membre de une classe de base, le programme est mal formé. [ Exemple:
struct B { virtual void f(int); }; struct D : B { void f(long) override; // error: wrong signature overriding B::f void f(int) override; // OK };
Et si B::f
n'aurait pas été marqué comme virtuel? Le programme est-il mal formé, alors? Ou est override
alors être ignoré`. Je ne trouve aucun traitement de cette affaire dans le texte std.
Mise à jour 1/2 (fusionné) J'ai transmis une demande aux éditeurs C++ pour qu'ils examinent la situation. Merci Johannes de me l'avoir signalé.
Mais en réalisant cela, j’ai constaté que l’intention du mot clé contextuel "override" ne pouvait pas être respectée: si une faute de frappe dans le nom de la fonction ou un type d’argument incorrect rendait la fonction elle-même non virtuelle, le texte de la norme ne s’appliquerait jamais - - et "override" est rendu inutile.
La meilleure solution possible peut être
Et si
B::f
n'aurait pas été marqué comme virtuel? Le programme est-il mal formé, alors?
Oui, ça l'est. Parce que pouroverridequelque chose, ce quelque chosedoit êtreêtre virtuel. Sinon, ce n'est passurcharger, c'estcacher. La réponse positive découle donc de la citation de votre question.
Si B:f
n'était pas virtuel, les fonctions les deux D:f
seraient mal formées.
Oui, le programme est mal formé lorsque override
est ajouté à une fonction non virtuelle.
Généralement, les fonctions avec des signatures différentes (surchargées) sont aussi différentes que les fonctions avec des noms différents. L'exemple donné dans la spécification n'implique pas que le nom de la fonction a pour effet override
. Cela a pour but de montrer l'erreur commune que override
est conçue pour empêcher.