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 dans la classe de base virtuelle C++


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Developer
    Inscrit en
    Janvier 2023
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Developer
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2023
    Messages : 15
    Points : 23
    Points
    23
    Par défaut problème dans la classe de base virtuelle C++
    J'ai une question sur la classe de base virtuelle alors qu'après avoir lu cet article Une classe de base virtuelle est présentée pour surmonter le "redouté diamant de la mort" / problème d'ambiguïté dans l'héritage multiple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A { public: void Foo() {} };
    class B : public virtual A {};
    class C : public virtual A {};
    class D : public B, public C {};
    Que se passe-t-il lorsqu'un mot-clé virtual n'est pas utilisé dans la déclaration de classe C. Pourriez-vous s'il vous plaît m'expliquer en détail?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A { public: void Foo() {} };
    class B : public virtual A {};
    class C : public A {};
    class D : public B, public C {};

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Si l'héritage n'est pas virtuel, la classe D aura 2 fois les champs de A, les uns étant les champs hérités de B et les autres héritant de C.
    Quand vous indiquez un champ hérité de A, sans spécifié si c'est celui de B ou celui de C, je crois que c'est celui correspondant au premier parant, je crois.
    Mais c'est une peau de banane, c'est pour cela qu'il faut éviter les héritages en diamant, ou, sinon, qu'il soit sémantiquement équivalent à un seul jeu de champ hérité donc en spécifiant "virtual" pour l'héritage.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Février 2013
    Messages : 70
    Points : 146
    Points
    146
    Par défaut
    C++ ne choisi pas la première, la construction étant ambiguë, elle ne compile pas.

    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
    #include <iostream>
     
    using namespace std;
     
     
     
     
    class A { public: int X; };
    class B : virtual public A {};
    class C : public A {};
    class D : public B, public C {};
     
    int main()
    {
        D InstanceDeD;
        //InstanceDeD.X=0;//Ne compile pas car il y a a ambiguïté : il y a deux X : B::X et C::X
        InstanceDeD.B::X=-570;
        InstanceDeD.C::X=100;
     
        cout << InstanceDeD.B::X << endl;
        cout << InstanceDeD.C::X << endl;
        return 0;
    Il existe deux variable X, une dans la classe B, dont le nom est B::X et une autre, complètement indépendante, dans la classe C dont le nom est C::X. InstanceDeD.X=0; ne compile pas, par ce que le compilateur ignore dans lequel des deux X il doit affecter la valeur 0.

    Le cout démontre que les deux variables sont indépendantes en écrivant « 570 » et « 100 ».

    Il existe une autre source d’ambiguïté avec ce type d'héritage lorsque les classes B et C déclarent des variables du même nom.

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Salut,

    virtual pour un héritage permet d'indiquer que la base est partageable. La structure interne de l'objet est plus complexe qu'habituellement pour permettre cela. Si la base X est vue partageable d'un côté et non partageable de l'autre, une des 2 n'est pas partageable et tu as alors 2 X distincts.

    Et en français on parle d'héritage en losange; dans "diamond inheritance", le mot "diamond" correspond au carreau des cartes. Ca s'identifie au dessin représentant les héritages dans ce cas. Le terme français losange a du sens, pas le terme diamant.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/10/2009, 21h22
  2. Réponses: 13
    Dernier message: 20/10/2008, 16h36
  3. problème dans la connexion à une base
    Par al3alwa dans le forum NetBeans
    Réponses: 7
    Dernier message: 29/08/2007, 09h19
  4. Constructeurs et classe de base virtuelle
    Par Paul Atreide dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2006, 17h04
  5. Problème dans une Classe
    Par Orbix dans le forum Langage
    Réponses: 8
    Dernier message: 02/10/2006, 14h52

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