Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'héritage

    16 août 2007 à 18:06:10

    Salut à tous!

    Voilà mon problème :
    J'ai une classe B qui dérive d'une classe A.
    J'ai besoin d'en faire une "liste", je fais donc un vector<A> qui contient des A et des B, j'ai lu que c'était autorisé.
    Seulement, lorsque je veux accéder à une méthode d'une occurence d'une classe fille B contenue dans mon vector, le compilo me crache que cette méthode n'appartient pas à A, la classe mère. Logique, puisque le vector est du type de A...

    Ma question : comment contourner le problème? N'est-il pas possible de faire une "liste" de classes mères et filles confondues?

    Merci pour vos réponses!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      16 août 2007 à 18:09:45

      Tu peut 'outrepasser' le problème grâce au polymorphisme.
      Exemple :
      1. #include <iostream>
      2. #include <vector>
      3. using namespace std;
      4. class Shape
      5. {
      6. public:
      7. virtual void SeDessiner(void) =0; //methode virtuelle pure pour éviter l'instanciation
      8. };
      9. class Carre : public Shape
      10. {
      11. virtual void SeDessiner(){cout<< "Je suis un carre" ;}
      12. };
      13. class Cercle : public Shape
      14. {
      15. virtual void SeDessiner(){cout<< "Je suis un cercle" ;}
      16. };
      17. int main(void)
      18. {
      19. vector<Shape*> v;
      20. v.push_back(new Carre);
      21. v.push_back(new Cercle);
      22. const int size = v.size();
      23. for(int i=0;i<size;i++)
      24. {
      25. v[i]->SeDessiner(); // <-- ici le polymorphisme
      26. }
      27. for(int i=0;i<size;i++)
      28. {
      29.     delete v[i];
      30. }
      31.  return 0;
      32. }

      L'inconvénient , c'est qu'il faut que ce soir les même nom de méthodes entre ta classe de base et sa dérivé.
      Sinon tu peut de bouffer des static_cast a tout va , mais ca va être lourd et pas très sure.
      • Partager sur Facebook
      • Partager sur Twitter
        16 août 2007 à 18:20:18

        Le probleme, si tu as un vector<A>, si tu y injectes une classe B, qui contient donc A+la partie B, il va y avoir upcasting, autrement dit, ta classe B va etre castée en A.
        --> Ta partie B est perdue : elle ne sera pas rangée dans le vector.

        si tu recuperes ton element dans un B (downcasting, car tu cast un A en B), alors tu pourras avoir n'importe quoi dans ta "partie B"...
        bref, c'est pas bon.

        Solution -> le polymorphisme, comme dit Davidbrcz :)
        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          16 août 2007 à 18:54:51

          Ok, merci à vous, je vais me tourner vers un tuto sur le polymorphisme. Jusque là, je me demandais à quoi ca servait, mais c'est en étant confronté au problème que l'on s'en rend compte!

          Citation : Fvirtman

          Le probleme, si tu as un vector<A>, si tu y injectes une classe B, qui contient donc A+la partie B, il va y avoir upcasting, autrement dit, ta classe B va etre castée en A.
          --> Ta partie B est perdue : elle ne sera pas rangée dans le vector.



          J'y ai pensé lorsque j'ai lu qu'on pouvait faire ca, et ca me paraissait bizarre. Maintenant que tu me dis que B est perdue, ca me semble logique!
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            16 août 2007 à 20:05:03

            le polymorphisme quel qu'il soit (surcharge, générécité[template], redéfinition[ici] ) est un des fondements de langage OO.
            • Partager sur Facebook
            • Partager sur Twitter
              16 août 2007 à 21:40:55

              Pour être simple : le polymorphisme c'est faire passer des instances de classes filles pour des instances de classes mères.
              Cependant, pour pouvoir s'en servir dans ton vector par exemple, il faut utiliser soit des références sur A (A&) soit des pointeurs sur A (A*) .
              • Partager sur Facebook
              • Partager sur Twitter
                16 août 2007 à 22:58:15

                (On ne peut pas écrire des std::vector<T&>)
                • Partager sur Facebook
                • Partager sur Twitter
                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                  17 août 2007 à 2:37:25

                  (oui c'est vrai, car les références doivent être initialisées à la création)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Problème d'héritage

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown