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 :

Problème d'héritage multiple


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut Problème d'héritage multiple
    Bonjour
    Mon projet comporte 4 classes liées de la manière suivante :
    D -----> C ----- > A
    D -----> B ----- > A
    où une flèche signifie : héritage public de

    Premier problème :
    Quand je crée un objet D, comment faire pour qu'il n'appelle pas deux fois le constructeur de la classe A ?

    Ensuite j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A b = B();
    A c = C();
    b.afficher();
    c.afficher();
    Second problème :
    Comment faire pour que lorsque je fais b.afficher() ça appelle la fonction B::afficher() (alors que dans ce cas cela appelle A::afficher()) ?

    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Premier problème: Cas classique d'héritage en losange. Voir "classes de base virtuelles".

    Second problème: Tu dois travailler par référence (ou pointeur) et non par valeur. Avec ce code, tu ne fais que recopier la partie A de tes objets dans de nouveaux objets de type A.

    Pour éviter cela, tu devrais déclarer protected le constructeur de copie de A.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 28
    Par défaut
    Je peux peut-être répondre à ta seconde question. L'héritage ainsi que le polymorphisme permet aux classes de remonter la hiérarchie si elle ne trouve pas la méthode demandé de sa classe. Donc, pour que B appel sa méthode à lui Afficher(), tu dois la créer dans la classe A ainsi que dans la classe B. De ce fait, lorsque tu appel la fonction afficher par b.afficher(), il va trouver la méthode afficher de la classe B, si elle n'existe pas, elle va donc remonté pour choisir la méthode afficher de la classe A.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut Toujours des problèmes
    J'ai donc fait mes classes de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A {};
    class B : public virtual A {};
    class C : public virtual A {};
    class D : public virtual B,public C {};
    Je veux ensuite tester mon code mais toujours des erreurs :
    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
    int main(void)
    {
    A *tab[3];
     
    B b = B();
    tab[0] = &b;
     
    C c = C();
    tab[1] = &c;
     
    D d = D();
    tab[2] = &d;
     
    tab[0]->affiche();
    // Appel à A::affiche()
     
    tab[1]->affiche();
    // Appel à A::affiche()
     
    tab[2]->affiche();
    // Appel à A::affiche()
     
    return 0;
    }

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour ta première erreur, c'est bizarre (je ne pensais pas avoir ça avec l'héritage virtuel).
    Pour la seconde, A::affiche() doit être déclarée virtual.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut Petit oubli!!!
    Oui effectivement j'avais déclarée cette fonction virtuelle au départ mais j'ai oublié de le remettre. Donc j'ai remis cela, ça appelle bien les bonnes fonctions maintenant.
    Cependant un autre problème est arrivé entre temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A {};
    class B : public virtual A {};
    class C : public virtual A {};
    class D : public virtual B,public C {};
     
    D d = D();
    tab[2] = &d;
    /* Appel au constructeur B()
     * Appel au constructeur C()
     * Appel au constructeur D()
     ** Il n'y a plus d'appel au constructeur A()
     */

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est bizarre, normalement, le constructeur de A est appelé (mais tous les appels suivants sont ignorés).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. L'épineux problème de l'héritage multiple
    Par syntaxerror dans le forum C#
    Réponses: 3
    Dernier message: 17/08/2010, 14h24
  2. Réponses: 8
    Dernier message: 03/03/2009, 19h58
  3. problème d'héritage multiple
    Par thiouwz dans le forum Langage
    Réponses: 3
    Dernier message: 28/10/2006, 16h35
  4. Réponses: 19
    Dernier message: 13/07/2006, 13h35
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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