Elements hérités dans une liste

Elements hérités dans une liste - C++ - Programmation

Marsh Posté le 17-07-2007 à 18:53:45    

Bonjour,
 
Je rencontre un problème dans le programme suivant :
 

Code :
  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. class Article
  5. {
  6. public :
  7.  
  8.   Article() {}
  9.   virtual void tva()
  10.   {
  11.     cout << "tva = " << 19.6 << endl;
  12.   }
  13. private :
  14. };
  15. class Livre : public Article
  16. {
  17. public :
  18.  
  19.   void tva()
  20.   {
  21.     cout << "tva = " << 5.5 << endl;
  22.   }
  23.  
  24. private :
  25. };
  26. class Medicament : public Article
  27. {
  28. public :
  29.  
  30.   void tva()
  31.   {
  32.     cout << "tva = " << 2.1 << endl;
  33.   }
  34.  
  35. private :
  36. };
  37. int main()
  38.   list<Article> lart;
  39.   list<Article>::iterator it;
  40.   Livre article0;
  41.   Medicament article1;
  42.  
  43.   lart.push_back(article0);
  44.   lart.push_back(article1);
  45.   it = lart.begin();
  46.   it->tva(); // Affiche 19.6 !!
  47.   it++;
  48.   it->tva(); // Affiche 19.6 !!
  49. };


Comme indiqué, la méthodes tva() appliquée aux deux objets de la liste d'article renvoie 19.6, malgré la virtualité de la méthode tva() qui, je l'espérais, allait conduire à appliquer la méthode tva() propre à chacun des deux objets (soit 5.5 pour les livres et 2.1 pour les médicaments). Pourriez-vous m'indiquer d'où vient le problème et comment forcer le programme à appliquer la méthode propre à chacune des classes, sans faire appel à la méthode de la classe parent (mais en continuant à travailler avec les éléments d'une liste !).
 
Est-ce un problème avec l'utilisation du polymorphisme ?
 
D'avance merci

Reply

Marsh Posté le 17-07-2007 à 18:53:45   

Reply

Marsh Posté le 17-07-2007 à 18:58:38    

faut la redefinir vrtuelle dans les classes filles

Reply

Marsh Posté le 17-07-2007 à 19:01:19    

Je viens de faire la correction que tu proposes sans que cela ne change rien.
Désolé, mais le problème vient d'ailleurs.

Reply

Marsh Posté le 17-07-2007 à 19:07:38    

Le polymorphisme ne marche qu'avec des pointeurs.
Ajouter le mot clé 'virtual' dans les classes dérivées, c'est surtout une indication de notation il me semble (si je me trompe, corrigez-moi svp ;)).

Reply

Marsh Posté le 17-07-2007 à 19:13:02    

effectivement, l'ajout dans le vecteur va faire une copie de l'objet donc ...


Message édité par KangOl le 17-07-2007 à 19:13:15
Reply

Marsh Posté le 17-07-2007 à 19:19:20    

Par rapport à vos indications, la modification du main en :
 

Code :
  1. int main()
  2.   list<Article*> lart;
  3.   list<Article*>::iterator it;
  4.   Livre article0;
  5.   Medicament article1;
  6.  
  7.   lart.push_back(&article0);
  8.   lart.push_back(&article1);
  9.   it = lart.begin();
  10.   (*it)->tva(); // Affiche 5.5
  11.   it++;
  12.   (*it)->tva(); // Affiche 2.1
  13. };


donne les résultats attendus.
 
Me conseillez-vous cette écriture ?

Reply

Marsh Posté le 17-07-2007 à 19:25:51    

bah c'est la seule manière de faire ;)

Reply

Marsh Posté le 17-07-2007 à 19:28:50    

En renforçant tes pointeurs par à peu près n'importe quelle méthode de gestion de pointeur, oui (que ce des auto_ptr<> ou des boost::shared_ptr<> ou... autre (boost en possède une belle collection)).
Taz a également fait mention il y a quelques jours de conteneurs adaptés à l'utilisation de pointeur chez boost

Reply

Marsh Posté le 18-07-2007 à 11:45:48    

nathan_g a écrit :

Par rapport à vos indications, la modification du main en :
 

Code :
  1. int main()
  2.   list<Article*> lart;
  3.   list<Article*>::iterator it;
  4.   Livre article0;
  5.   Medicament article1;
  6.  
  7.   lart.push_back(&article0);
  8.   lart.push_back(&article1);
  9.   it = lart.begin();
  10.   (*it)->tva(); // Affiche 5.5
  11.   it++;
  12.   (*it)->tva(); // Affiche 2.1
  13. };


donne les résultats attendus.
 
Me conseillez-vous cette écriture ?


Certainement pas le point après la } fermante du main. Manque des destructeurs virtuels et faut prendre conscience des problèmes d'allocation. Et écrire ++ et pas ++

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed