IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

pourquoi mettre également virtual sur une méthode de la classe dérivée


Sujet :

Langage C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut pourquoi mettre également virtual sur une méthode de la classe dérivée
    Bonjour à tous,

    si je met dans ma classe de base une méthode en virtual : virtual void ma_fonction();

    Qu'elle est l'interet de mettre également virtual sur la méthode void ma_fonction() de la classe dérivée ?

    Pourquoi il est également bien vue de mettre un override sur la méthode de ma classe dérivée :virtual void ma_fonction() override;

    Merci d'avance pour vos éclaircissements

  2. #2
    Membre à l'essai
    Homme Profil pro
    Apprenti informaticien à l'ETML
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprenti informaticien à l'ETML

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Points : 20
    Points
    20
    Par défaut
    Salut,

    En remettant 'virtual' devant une méthode surchargée, tu permet à une classe dérivée de re-surcharger la méthode.

    Et pour le mot clé 'override', ça sert à vérifier que la méthode que tu surcharges est bien une méthode existante dans la classe parente. Donc le compilateur te préviendra si jamais tu as mal recopié la signature.

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    En remettant 'virtual' devant une méthode surchargée, tu permet à une classe dérivée de re-surcharger la méthode.
    Non. La virtualité est un état hérité, il n'y a aucunement besoin de remettre virtual dans les fonctions dérivées: elles le sont déjà. C'est même une mauvaise pratique, car cela rendrait virtual une fonction même si la classe de base ne le fait plus suite à un refactoring. Pour les dérivées, seul override doit être utilisé comme tu l'as expliqué.

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Erreur de vocabulaire.

    La surcharge est l'acte de fournir une définition supplémentaire de signature différente. En vo, c'est "to overload".
    "to override" se traduit traditionnellement par redéfinir, c'est l'acte de supplanter (*) une définition de fonction (obligatoirement virtuelle) d'une classe parente par une définition spécialisée dans une classe fille. Les signatures sont obligatoirement identiques -- à des détails de retour-covariant.

    Pour ce qui est de mettre "virtual" au niveau des redéfinitions (où il est facultatif/implicite), c'est ce que l'on faisait généralement en C++98/03 pour des raisons de documentation, à destination des humains donc. Comme souligné, cela cache les erreurs suite à refactoring.

    Depuis le C++11, la bonne pratique est :
    - d'utiliser "virtual" au niveau de la première apparition d'une fonction virtuelle dans une hiérarchie, on n'a pas le choix. A noter que cela ne règle pas les problèmes de masquages
    - d'utiliser "override" seul pour les spécialisations/redéfinitions suivantes
    - ou d'utiliser "final" seul pour les spécialisations/redéfinitions qui n'ont plus vocation à être supplantées dans la hiérarchie

    Quant à "override", cela demande au compilateur de vérifier qu'une fonction marquée par ce mot clé correspond bien à une redéfinition -- même signature, et qu'il ne s'agit ni d'une première définition ni d'un masquage (sorte de surcharge dégénérée).

    (*) en contexte POO, supplanter est un terme plus juste et fort de sens en Français, mais ce n'est pas la traduction usuelle de "to override" (dans notre contexte). Et en plus, je ne suis pas sûr qu'il ait un substantif.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Personnellement, je recommande fortement de mettre des overrides dès que possible. Cela évite tes nœuds aux cerveaux avec des codes comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct Foo {
        virtual void setup() {}
    };
     
    struct SpecialFoo {
        void Setup() {} // Setup() n'est pas setup() ! On ne redéfinit rien du tout ici...
    };
    En rajoutant override, on a un warning :
    prog.cc:6:10: error: 'void SpecialFoo::Setup()' marked 'override', but does not override
        6 |     void Setup() override {}
          |          ^~~~~
    1
    Il y a un warning très utile dans GCC pour ça (http://gcc.gnu.org/onlinedocs/gcc/Wa...Options.html):
    -Wsuggest-override
    Warn about overriding virtual functions that are not marked with the override keyword.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre un intercepteur sur une méthode n'appartenant pas à l'EJB
    Par Monte-Cristo dans le forum Wildfly/JBoss
    Réponses: 5
    Dernier message: 17/06/2013, 18h22
  2. mettre un timer sur une méthode
    Par p1xl_01 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 12/07/2010, 17h45
  3. Mettre du texte sur une vidéo(ou par dessus un tmediaplayer)
    Par souch dans le forum Composants VCL
    Réponses: 9
    Dernier message: 08/07/2004, 14h30
  4. Réponses: 3
    Dernier message: 16/04/2004, 17h51
  5. Comment mettre un label sur une image
    Par dug dans le forum MFC
    Réponses: 3
    Dernier message: 07/04/2004, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo