web-dev-qa-db-fra.com

redéfinition des fonctions non virtuelles

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é.

  • "void f(long) override" ne remplace pas une fonction, en particulier. pas de virtuel,
  • donc ce n'est pas virtuel
  • par conséquent, le texte "Si une fonction virtuelle est marquée avec ..." ne s'applique pas
  • par conséquent, l'exemple ne correspond pas au texte.

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

  • mettre "virtuel" devant les fonctions de l'exemple
26
towi

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.

24
Armen Tsirunyan

Si B:f n'était pas virtuel, les fonctions les deux D:f seraient mal formées.

0
Branko Dimitrijevic

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.

0
deft_code