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 :

Downcasting, héritage ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut Downcasting, héritage ?
    Bonjour,
    J'ai créé une classe (S) qui gère un tableau de classe (A) avec les fonctions add() et get(int index):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class S:
    {
      S();
      void add(*A);
      A *get(int index);
     
      private :
        A tableA[SIZE];
    }
    Si je créé une classe B, fille de A mais qui contient en plus la méthode "float B::getV()" je peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      S *s=new S();
     
      B *b=new B();
      s->add(b);
    Par contre, "s->get(0);" va me retourner un pointeur vers A, alors que c'est la classe B que j'ai mis dans le tableau ... comment récupérer un pointeur vers la classe B (car je souhaite ensuite accéder à B.getV()) ? J'imagine que c'est un classique ...

    En vous remerciant par avance ...
    Christian

  2. #2
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Premièrement, il y a quelques fautes à ton exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class S:
    {
      public:
      S();
      void add(*A);
      A *get(int index);
     
      private :
        A tableA[SIZE];
    }; <= manque le point virgule
    Ensuite, tableA contient des objets et non pas des pointeurs, du coup, tu perds la notion de polymorphisme...

    Au lieu d'utiliser des tableaux (issu de C), utilise plutôt des conteneurs, en occurence vector qui contient des pointeurs sur objet A.

    Tu pourras faire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<A*> listA;
     
    listA.push_back(new A());
    listA.push_back(new B());
    Et là, tu conserves la notion de polymorphisme

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Oui c'est un classique. C'est quand même souvent un indice de mauvaise conception...
    Traditionnellement, ça se résoud:
    • par un simple dynamic_cast quand tu sais vraiment ce que tu fais
    • par un pattern visiteur

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut
    Merci pour vos réponse.
    @poukil: voici ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    B *b1=new B(v1);
    B *b2=new B(v2);  // v, valeur obenu par getV()
     
    S *s=new S(); 
    s->add(b1);
    s->add(b2);
     
    B *b=static_cast<B*>(s->get(0));
    Je récupère bien un pointeur vers une classe B (et non vers une classe A). Par contre b->getV() me renvoi 0 (au lieu de v2) ... je pense que ceci est effectivement lié au fait que S et une table d'objet A et non pas une table de pointeurs vers les objets. Du coup, la valeur v2 est perdue en faisant s->add(b1) (puisqu'il créé un nouvel objet de type A).

  5. #5
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par coberle Voir le message
    Merci pour vos réponse.
    @poukil: voici ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    B *b1=new B(v1);
    B *b2=new B(v2);  // v, valeur obenu par getV()
     
    S *s=new S(); 
    s->add(b1);
    s->add(b2);
     
    B *b=static_cast<B*>(s->get(0));
    Je récupère bien un pointeur vers une classe B (et non vers une classe A). Par contre b->getV() me renvoi 0 (au lieu de v2) ... je pense que ceci est effectivement lié au fait que S et une table d'objet A et non pas une table de pointeurs vers les objets. Du coup, la valeur v2 est perdue en faisant s->add(b1) (puisqu'il créé un nouvel objet de type A).
    Oui, ayant déclaré un objet de type A, tu perds toutes les infos des types hérités.

  6. #6
    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
    Est-ce que B est vraiment un A ?
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut
    @mister3957 : j'avoue ne pas comprendre ta question ...

  8. #8
    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
    Je voulais dire, est-tu sûr que l'héritage convient à ton problème ? On l'utilise si et seulement si la relation "B est un A" est vérifié.

    Bien souvent on l'utilise à tort ce qui provoque ce style de désagrément. Peut-tu nous en dire plus sur le contexte ? Que représentent A et B (rapidement juste pour déterminer leur relations) ainsi que la méthode GetV() ?
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut
    @mister3957 : merci pour ta réponse. A représente un Point et B un PointW (i.e. un point avec un poids). getV retourne le poids.
    Christian

  10. #10
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Donc cohérent en occurrence. Tu as réussi à résoudre ton problème en prenant en compte nos remarque?

  11. #11
    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
    Je pense pas que ça soit une bonne idée de faire comme ça...

    Et est-ce que un Point n'est pas un PointW qui a un poid de 0 ? ou 1 ?
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut
    @Trunks : oui, le problème est résolu et en plus j'ai appris des choses. Encore merci à vous tous.

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

Discussions similaires

  1. [WD19] Poo, Héritage, Upcast, Downcast et DataBinding
    Par Donpi dans le forum WinDev
    Réponses: 6
    Dernier message: 03/07/2015, 15h51
  2. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  3. [Héritage] Downcasting et méthodes virtuelles
    Par poukill dans le forum C++
    Réponses: 8
    Dernier message: 16/07/2007, 13h38
  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