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 :

Heritage et masquage


Sujet :

C++

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut Heritage et masquage
    Voila, j'ai une classe de base B et une classe derivee D qui herite de B.
    B et C implementent une methode virtuelle get() telle que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class B
    {
        virtual Widget1 get() { ... }
    };
     
    class D : public B
    {
        virtual Widget2 get() { ... }
    };
    Etant donne qu'il n'y a aucune relation d'heritage entre les type de retour Widget1 et Widget2, il me dit qu'il y a incompatibilite dans les types de retour. Si j'enleve le virtual ca marche par contre mais n'y a t - il pas masquage alors dans ce cas ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si j'enleve le virtual ca marche par contre mais n'y a t - il pas masquage alors dans ce cas ?
    Si.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    En vait, virtual te permet de choisir au runtime quelle fonction sera exécutée.

    Je problème, c'est que le C++ ne peux pas décider quelle fonction prendre sur base du seul changement du type de retour (tu ne peux pas avoir 2 fonctions avec les prototypes qui changent uniquement sur la base du type de retour). Et c'est ce que tu fait avec ton héritage.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut
    Donc, dans mon cas, il ne vaut mieux pas utiliser l'heritage alors ?

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 638
    Par défaut
    Salut,
    Citation Envoyé par Bruno Gillet Voir le message
    En vait, virtual te permet de choisir au runtime quelle fonction sera exécutée.

    Je problème, c'est que le C++ ne peux pas décider quelle fonction prendre sur base du seul changement du type de retour (tu ne peux pas avoir 2 fonctions avec les prototypes qui changent uniquement sur la base du type de retour). Et c'est ce que tu fait avec ton héritage.
    Ce n'est pas tout à fait vrai... il existe un concept qui s'appelle le "retour co-variant" qui permet, justement, de renvoyer des types différents.

    La limite étant qu'il faut renvoyer soit un pointeur soit une référence et qu'il y ait une relation d'héritage qui unisse les différents types (on crée alors le prototype dans l'interface avec la classe de base et ceux dans les classes d'implémentaiton avec les types concrèts )

    Un code du genre 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class A
    {
        /*...*/
    };
    class B:public A
    {
        /*...*/
    };
    class C:public A
    {
        /*...*/
    };
    class Base
    {
        public:
            /*...*/
            virtual A& GetVal()=0;
    };
    class D1:public Base
    {
        public:
            /*...*/
            virtual B& GetVal(){return b;}
        private:
            B b;
    };
    class D2:public Base
    {
        public:
            /*...*/
            virtual C& GetVal(){return c;}
        private:
            C c;
    };
    étant tout à fait valide...

    @ Bruno Gillet: Peut être te baser sur les explications ci-dessus pour créer une interface qui te permettrait de retomber sur une classe mere commune à tes deux widget
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    Citation Envoyé par vandamme Voir le message
    Donc, dans mon cas, il ne vaut mieux pas utiliser l'heritage alors ?
    A quoi celà va-t-il servir ?
    Le but de ce que tu fait en OO est de pouvoir écrire
    et de ne pas devoir tenir compte de quelle fonction sera appelée.

    Comment va-tu définir x dans le cas précédent ? Widget1 ? Widget2 ?

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut
    Oui, tu as raison. C'est clair. Surtout qu'il n'y a aucun redesign possible pour faire une relation d'heritage entre Widget1 et Widget2

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,
    Ce n'est pas tout à fait vrai... il existe un concept qui s'appelle le "retour co-variant" qui permet, justement, de renvoyer des types différents.
    Entièrement d'accord avec toi

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 638
    Par défaut
    Ceci dit, il n'y a aucune limite quant au niveau de l'héritage des types de retours...

    Si widget1 hérite d'une classe qui hérite d'une classe qui hérite (...) d'une classe object et que widget2 est aussi dans le cas, ca marche tout aussi bien

    Bien sur, j'interprète peut peut être à tord le fait que widget1 et widget2 soient des objets de bibliothèque graphiques... mais, sinon, tu trouvera sans "grosse" difficulté une classe "ancètre" commune
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. heritage des contraintes
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 30/04/2004, 12h04
  2. [Kylix] heritage multiple et interfaces :(
    Par le_barbu dans le forum EDI
    Réponses: 4
    Dernier message: 26/01/2004, 19h30
  3. [Postgres] Pb d'heritage...
    Par anonia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2003, 22h34
  4. [HERITAGE] Redondance ou pas redondance ???
    Par cyrillus76 dans le forum Schéma
    Réponses: 1
    Dernier message: 11/06/2003, 09h46
  5. [PostgreSQL] Question vis a vis de l'heritage...
    Par Gandalf dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/05/2003, 16h53

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