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 éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    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

  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
    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 éclairé

    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
    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");

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