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

C++ Discussion :

Mot clef virtual, classes filles


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut Mot clef virtual, classes filles
    Bonjour,

    Je constate souvent que le mot clef virtual est très souvent réutilisé dans les méthodes virtuelles des classes filles, ce même si la classe fille n'est pas destinée à être dérivée.

    Je ne vois dans ce cas aucune raison de le faire et j'aimerai confirmation ou que l'on me dise ce que je n'aurai pas vu.

    NB : Il est évident que si la classe fille doit être à son tour spécialisée en une ou plusieurs petites-filles, le mot clef devient indispensable.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Salut,

    De toute manière si la méthode a été déclarée virtuelle dans la classe mère, elle le sera pour toute la hiérarchie de classes, la redéclarer virtual ou non dans les classes filles ne change rien.

    Pour les nouvelles méthodes des classes filles (i.e. n'existant pas dans la classe mère), le problème est qu'aujourd'hui tu n'as pas besoin de dériver de cette classe, mais rien ne dit que ça ne soit pas le cas dans le futur. Donc certains préfèrent déclarer les méthodes virtuelles.

    Maintenant si la classe fille ne doit JAMAIS être spécialisée (donc ça part plus de l'idée on "interdit" la spécialisation plutôt que "on en aura pas besoin") effectivement ces méthodes ne doivent pas êter déclarées virtual. Mais comme je l'ai dit, cette limitation portera uniquement sur les nouvelles méthodes des classes filles, les méthodes virtual de la classe mère seront toujours redéfinissables si jamais quelqu'un décide d'étendre la hiérarchie de classes.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    C'est une question de lisibilité. Une fonction virtuelle dans la classe de base est automatiquement virtuelle dans la classe dérivée. Remettre le mot clé virtual ne sert qu'a éviter au lecteur d'aller voir la classe de base pour savoir si une fonction est virtuelle ou non.

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    +1 à la réponse de Sylvain (vu qu'il y a deux réponses divergentes, j'appuie la juste)

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Effectivement ma réponse est imprécise sur ce point :

    De toute manière si la méthode a été déclarée virtuelle dans la classe mère, elle le sera pour toute la hiérarchie de classes, la redéclarer virtual ou non dans les classes filles ne change rien.
    J'aurais dû ajouter "au niveau du langage". Après, je suis tout à fait d'accord que remettre le mot-clé "virtual" dans les classes filles aide à la lisibilité

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Donc pas de perte de performances?

    Car si c'était la cas, on pourrait rendre tout aussi lisible le fait de regrouper les méthodes virtuelles filles dans le .h ou de placer un simple commentaire au dessus la declaration et definition de la méthode ou encore de trouver une convention d'écriture genre "On..."

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Faut il le rappeler, un code est beaucoup plus souvent lu qu'il n'est écrit/modifié ...Même si on peut se contenter de parcourir les en-têtes

    Au niveau du langage, il n'y a effectivement pas de problèmes à "oublier" le mot-clé virtual si l'on redéfinit exactement la fonction qui a été déclarée dans la classe mère, car une fonction déclarée virtuelle reste virtuelle par la suite.

    J'insiste sur le terme exactement parce que, dans l'exemple de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Mere
    {
        public:
            Mere();
            virtual ~Mere();
            virtual void MaFonct(int);
            /*...*/
    },
    class Fille
    {
     
        public:
            Fille();
            virtual ~Fille();
            void MaFonct(double);
            /*...*/
    };
    , il s'agit d'une surcharge de la fonction (qui, en plus, cache Mere::Mafonct(int), me semble-t-il)

    Par contre, du fait que, allez, je me répète, un code source est plus souvent lu qu'il n'est écrit/modifié, le fait de mettre le mot clé virtual permettra de savoir que c'est bel et bien la redéfinition d'une fonction qui existe dans la classe mère (voire, dans une des classes "ancêtre" ), alors que, sinon, soit le lecteur se dira "mince, je ne peux pas la redéfinir", soit il devra aller voir dans les fichiers d'en-têtes dans lesquels sont définies les classes parentes

    Par contre, il faut bien savoir que, si le fait de déclarer systématiquement toutes les fonctions virtuelles peut représenter une facilité lorsqu'on débute en programmation, cela reste une approche largement controversée:

    La présence du mot clé virtual indique au lecteur "en cas de besoin, tu peux redéfinir cette fonction si tu utilise cette classe comme classe mère d'une classe perso".

    Mais certaines fonctions n'ont aucune raison d'entrer dans cette catégorie, car son fonctionnement doit rester identique, même si on crée une classe qui dérive d'une classe qui dérive (d'une classe...) de la classe dans laquelle la fonction est définie.

    Cela n'a rien à voir avec la possibilité (ou non) de créer une classe qui dérive de celle dans laquelle la fonction est définie, cela a tout simplement à voir avec le fait que, si je veux que la fonction fasse 3+1, il n'y a, tout simplement, pas de raison qu'elle se mette à faire 5*3 ailleurs

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/08/2012, 14h44
  2. Propagation du mot clef virtual
    Par Lavock dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2010, 12h26
  3. Réponses: 1
    Dernier message: 06/11/2009, 00h20
  4. classes et méthodes abstraites (le mot clef abstract)
    Par nabilfaouzi dans le forum VB.NET
    Réponses: 1
    Dernier message: 28/09/2009, 08h09
  5. probleme de virtual dans la classe fille
    Par xtaze dans le forum C++
    Réponses: 23
    Dernier message: 26/04/2005, 21h39

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