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 :

Héritage en losange


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Héritage en losange
    Bonjour à tous,


    Je maîtrise un peu mal les héritages virtuels. J'ai une classe de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class CMaBase
    {
    public:
        void Add(const std::string& rstrCode);
    private:
        std::vector<std::string> m_vecCodes;
    }
    Puis deux classes héritant de cette classe de base :
    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
     
    class CMaSubClass1 : virtual public CMaBase
    {
    public :
        CMaSubClass1() {
        Add("Code 1 de CMaSubClass1");
        Add("Code 2 de CMaSubClass1"); }
    }
     
    class CMaSubClass2 : virtual public CMaBase
    {
    public :
        CMaSubClass1() {
        Add("Code 1 de CMaSubClass2");
        Add("Code 2 de CMaSubClass2"); }
    }
    Et enfin une classe finale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class CMaClassFinale : public CMaSubClass1, CMaSubClass2
    {
       // J'aimerai que m_vecCodes ici contiennt les codes 1 et 2 des subclass 1 et 2, soit 4 codes
    }

    En fait ça fonctionne mais à un moment dans mon code j'airai besoin de downcaster un CMaBase* en une de ses classe fille, et j'obtient une erreur :

    error C2635: impossible de convertir un(e) 'CMaBase*' en un(e) 'CMaSubClass1*'; conversion à partir d'une classe de base virtuelle implicite

    L'objectif étant qu'il y ai un membre au niveau de la classe de base que les différentes classes héritées remplissent, et faire une classe les réunissant via l'héritage multiple pour avoir une liste complète.


    Est-ce possible de faire ça ?


    Merci beaucoup,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class CMaClassFinale : public CMaSubClass1, CMaSubClass2
    Quand tu fais ça, tu déclares CMaClassFinale héritant de CMaSubClass1 en public, et CMaSubClass2 en privé.
    Est-ce que c'est vraiment ce que tu voulais?


    Sinon, tu peux donner la ligne qui fait ce que tu dis là?
    En fait ça fonctionne mais à un moment dans mon code j'airai besoin de downcaster un CMaBase* en une de ses classe fille, et j'obtient une erreur :

  3. #3
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 105
    Points
    105
    Par défaut
    Code C++ : 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
    class CMaBase
    {
    public:
        void Add(const std::string& rstrCode);
        std::vector<std::string> m_vecCodes;
    };
     
    class CMaSubClass1 : public CMaBase
    {
    public :
        CMaSubClass1() {
        Add("Code 1 de CMaSubClass1");
        Add("Code 2 de CMaSubClass1"); }
    };
     
    class CMaSubClass2 : public CMaBase
    {
    public :
        CMaSubClass1() {
        Add("Code 1 de CMaSubClass2");
        Add("Code 2 de CMaSubClass2"); }
    };
     
    class CMaClassFinale : public CMaSubClass1, public CMaSubClass2
    {
    }
    Note que l'héritage de CMaSubClass1 et CMaSubClass2 n'est pas virtuel. (j'ai aussi mit m_vecCodes en public pour l'exemple ci dessous)
    Et ça s'utilise comme ça :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CMaClassFinale tmp;
    tmp.CMaSubClass1::m_vecCodes.push_back("Ajout dans CMaSubClass1");
    tmp.CMaSubClass2::m_vecCodes.push_back("Ajout dans CMaSubClass2");
    "The worst errors I've ever seen do not came from no knowledge, but from having just the the right amount of it, too small to really understand what you're doing, but enough to think you did. That amount of knowledge, is evil."

Discussions similaires

  1. [Graphics View] [Conception] Héritage en losange : maladresse ou nécessité ?
    Par betsprite dans le forum Qt
    Réponses: 8
    Dernier message: 25/03/2012, 23h54
  2. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  3. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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