28 votes

Est-il judicieux d'ajouter le mot-clé final à la fonction virtuelle dans une classe qui n'a pas de classe de base (n'est pas dérivée)

Je lis un super tutoriel génial en C ++ 11 et l'auteur fournit cet exemple en expliquant le mot-clé final :

 struct B {
    virtual void f() const final;   // do not override
    virtual void g();
};
struct D : B {
    void f() const;     // error: D::f attempts to override final B::f
    void g();       // OK
};
 

Est-il donc logique d'utiliser ici le mot-clé final ? À mon avis, vous pouvez simplement éviter d'utiliser le mot clé virtual ici et éviter que f() ne soit remplacé.

32voto

Joachim Pileborg Points 121221

Si vous ne marquez pas la fonction comme virtual et final la classe enfant peut toujours implémenter la fonction et masquer la fonction de classe de base.

En créant la fonction virtual et final la classe enfant ne peut pas remplacer ou masquer la fonction.

11voto

Karl Nicoll Points 5915

Oui! Dans l'exemple que vous fournissez, le mot clé final empêche les classes dérivées de remplacer f() comme vous le dites correctement. Si la fonction n'est pas virtuelle, D:f() est autorisé à masquer la version de classe de base de la fonction:

 struct B {
    void f() const;   // do not override
    virtual void g();
};
struct D : B {
    void f() const; // OK!
    void g();       // OK
};
 

En faisant f() une fonction virtual et final , toute tentative de remplacement ou de masquage provoque une erreur de compilation.

2voto

Quentin Points 3904

Votre intuition est bonne: faire une fonction virtual seulement immédiatement pac, il avec final n'a pas d'avantages sur une fonction non virtuelle. C'est juste un court extrait d'exemple pour démontrer la fonctionnalité.

En outre, comme décrit dans les autres réponses, cela fait des sauts de la fonction de masquage -- vous ne sera jamais en mesure d'avoir un f fonction avec la même liste de paramètres en D ou de l'une de ses classes dérivées.
C'est un compromis à faire lorsque vous décidez de cap f de votre modèle. Depuis il n'y a aucun moyen d'effectuer un véritable appel virtuel ici, vous avez l'inconvénient et aucun avantage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X