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 :

Petite question sur les héritages?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 46
    Points
    46
    Par défaut Petite question sur les héritages?
    Bonjour à tous, voila j'ai un petit problème.
    J'aimerais savoir si on peut stocker, dans un tableau d'une classe mère, des éléments d'un de ses fils et surtout, le plus important, si on ne perd pas de données. Je pense que c'est possible, alors si oui pouvez vous me mettre un petit bout de code pour voir comment je peux récupérer les données qui sont uniquement dans la classe fille de ce tableau. Merci !

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,

    Ta demande n'est pas très claire, et j'ai peur de répondre "à coté" de ce que tu demandes...

    Pourrais tu nous donner un exemple de ce que tu veux vraiment faire

    Cependant, je peux déjà attirer ton attention sur le fait qu'une classe mère ne sait absolument rien de ce qui compose les classes qui en dérivent... Peut être est-ce que cela répondra déjà en partie à ta question
    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

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 288
    Points
    218 288
    Billets dans le blog
    117
    Par défaut
    Je vais aussi essayer de donner une indication, sachant que il faudrai préciser un peu la question ...

    Nous avons une classe A ( que nous appelerons classe mère )
    A contient une variable ( toto )
    Nous avons une classe B ( qui hérite de A )
    B peut accéder à toto, car B est un A , mais A n'est pas un B ( je sais plus comment on formule ce principe fondamental ).
    Bref , du code un peu ( ça parle mieux que moi ) ( et je montre une autre chose fondamentale en passant )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class A
    {
    	public:
    		int toto_public;
    	private:
    		int toto_private;
    	protected:
    		int toto_protected;
    };
    class B : public A
    {
     
    }
    Si je fais dans la classe B une fonction qui utilise toto_public ( accès + modification ) ça marche.
    Si je fais dans la classe B une fonction qui utilise toto_protected ça marche aussi.
    Par contre si j'essaie avec toto_private ça marche pas. Les private sont conservés, et ne peuvent être utilisé que par la classe elle même ( même pas par ces filles )

    Dans une fonction en dehors des classes A et B , l'accès ne sera possible que sur les toto_public ( pour cela que les fonctions sont souvent en public , pour pouvoir les utiliser ).

    Par nous pouvons remarquer que j'ai un héritage public ( : public A ), je sais que cela me permet de garder l'accès des variables aux filles.
    Mais dans le cas dans protected, ça change, genre les variables protected de A deviennet privé dans B ( donc seulement accéssibles dans B ) ... et donc plus hérité dans une classe qui hérite de B.

    En conclusion, pour faire simple, il est donc possible d'utiliser les variables d'une classe mère dans une classes filles. Après il faut faire attention à la visibilité


    => Lien qui sera mieux que moi : http://cpp.developpez.com/cours/cpp/?page=page_10#LX-E
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Points : 46
    Points
    46
    Par défaut
    Je vais vous donner un exemple pour être plus clair. Comme vous pouvez le voir si dessous, je crée trois classes. La classe de base Bonbon et deux de ses sous classes Dragibus et Caramel. Ensuite dans mon "main", j'aimerais avoir un tableau qui me permet d'avoir des cases avec des Dragibus et des Caramel. Je me suis donc dit qu'il fallait un tableau de type Bonbon. Mais à ce moment la je ne peux pas accéder à toutes les informations. Donc ma question est:
    Comment faire pour avoir un tel tableau et pouvoir acceder à toutes les informations de chaque case?

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    class Bonbon
    {
        public :
            int couleur;
     
        public :
    };
     
    class Dragibus : public Bonbon
    {
        public :
     
        double cacao;
        int cafe;
        char capourrilesdents;
     
        public :
            Dragibus( double d, int a, char c)
            {
                cacao = d;
                cafe= a;
                capourrilesdents = c;
                couleur = 12121212;
            }
    };
     
    class Caramel : public Bonbon
    {
        public :
        int sucette;
        float rutabaga;
     
        public :
            Caramel( int a, float q)
            {
                sucette = a;
                rutabaga = q;
                couleur = 21;
            }
    };
     
    int main()
    {
        Bonbon * tab;
        tab = new Bonbon[2];
        Dragibus drag( 234, 45, 'c');
        Caramel mel( 678, 45.89);
        tab[0] = drag;
        tab[1] = mel;
     
    }

  5. #5
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Hum et bien tu peux faire ça (je crois que c'est considéré comme "pas propre") :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    enum BonbonType
    {
        BONBON_DRAGIBUS,
        BONBON_CARAMEL
    };
     
    class Bonbon
    {
    public :
     
        virtual BonbonType GetType() const = 0;
        ...
    };
     
    class Dragibus : public Bonbon
    {
    public :
     
        virtual BonbonType GetType() const
        {
            return BONBON_DRAGIBUS;
        }
        ...
    };
     
    class Caramel : public Bonbon
    {
    public :
     
        virtual BonbonType GetType() const
        {
            return BONBON_CARAMEL;
        }
        ...
    };
     
    int main()
    {
        // Note : à ce stade, un std::vector ou une std::map est plus pratique...
        Bonbon** tab = new Bonbon*[2];
        tab[0] = new Dragibus( 234, 45, 'c');
        tab[1] = new Caramel( 678, 45.89);
     
        for (int i = 0; i < 2; ++i)
        {
            Bonbon* b = tab[i];
            if (b->GetType() == BONBON_DRAGIBUS)
            {
                Dragibus* d = (Dragibus*)b;
                // On utilise "d" comme on veut
                ...
            }
     
            if (b->GetType() == BONBON_CARAMEL)
            {
                Caramel* c = (Caramel*)b;
                // Pareil...
                ...
            }
        }
     
        // ... et on oublie pas ça :)
        for (int i = 0; i < 2; ++i)
            delete tab[i];
        delete[] tab;
    }
    L'inconvénient, c'est que si GetType() renvoie un truc faux, le programme ne va pas aimer... Donc source d'erreur.

    Normalement, quand on utilise l'héritage, la classe mère possède des méthodes qui sont souvent ré-implémentée par les classes filles.
    Du coup, quand on parcours ton tableaux de Bonbon, on ne se soucie pas de savoir de quel type ils sont, on appelle juste les méthodes de Bonbon qui auront été ré-implémentées par Caramel et Dragibus :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    class Bonbon
    {
    public :
     
        virtual int GetColor() const = 0;
        virtual void Display() const = 0;
        ...
    };
     
    class Dragibus : public Bonbon
    {
    public :
     
        virtual int GetColor() const
        {
            return 1212121212;
        }
     
        virtual void Display() const
        {
            // Afficher un joli dragibus
        }
        ...
    };
     
    class Caramel : public Bonbon
    {
    public :
     
        virtual int GetColor() const
        {
            return 21;
        }
     
        virtual void Display() const
        {
            // Afficher un joli caramel
        }
        ...
    };
     
    int main()
    {
        // Note : à ce stade, un std::vector ou une std::map est plus pratique...
        Bonbon** tab = new Bonbon*[2];
        tab[0] = new Dragibus( 234, 45, 'c');
        tab[1] = new Caramel( 678, 45.89);
     
        for (int i = 0; i < 2; ++i)
        {
            Bonbon* b = tab[i];
            int bonbonColor = b->GetColor();
            b->Display();
        }
     
        // ... et on oublie pas ça :)
        for (int i = 0; i < 2; ++i)
            delete tab[i];
        delete[] tab;
    }
    Dans la boucle, on fait donc tout sans savoir à quel type de bonbon on a affaire.

    Edit : j'avais pas fait attention à la construction du tableau... C'était pas très joli

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

Discussions similaires

  1. petite question sur l'héritage et les cast
    Par baedal dans le forum Langage
    Réponses: 3
    Dernier message: 29/02/2008, 01h48
  2. Petites question sur les onglets...
    Par jarod_bx dans le forum Access
    Réponses: 1
    Dernier message: 20/12/2005, 19h45
  3. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 10h40
  4. Réponses: 3
    Dernier message: 08/12/2004, 14h58
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 14h49

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