Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1579 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Elements hérités dans une liste

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Elements hérités dans une liste

n°1587821
nathan_g
Posté le 17-07-2007 à 18:53:45  profilanswer
 

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

mood
Publicité
Posté le 17-07-2007 à 18:53:45  profilanswer
 

n°1587822
KangOl
Profil : pointeur
Posté le 17-07-2007 à 18:58:38  profilanswer
 

faut la redefinir vrtuelle dans les classes filles

n°1587824
nathan_g
Posté le 17-07-2007 à 19:01:19  profilanswer
 

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

n°1587826
IrmatDen
Posté le 17-07-2007 à 19:07:38  profilanswer
 

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

n°1587828
KangOl
Profil : pointeur
Posté le 17-07-2007 à 19:13:02  profilanswer
 

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
n°1587829
nathan_g
Posté le 17-07-2007 à 19:19:20  profilanswer
 

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 ?

n°1587830
Joel F
Real men use unique_ptr
Posté le 17-07-2007 à 19:25:51  profilanswer
 

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

n°1587831
IrmatDen
Posté le 17-07-2007 à 19:28:50  profilanswer
 

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

n°1588077
Taz
bisounours-codeur
Posté le 18-07-2007 à 11:45:48  profilanswer
 

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 ++


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Elements hérités dans une liste

 

Sujets relatifs
[EXCEL] Liste déroulante sur multi spreadsheets ss ExcelTri de tableau sur la fréquence des éléments
[Zone de liste]Ligne de couleur différentes[Access] Valeur par défault liste déroulante
tester le choix fait dans un liste de choix[RESOLU] Une liste de pays dans ma base de données SQL
Avoir la liste de toutes les fonctions PHP + plantage WAMPPersonnaliser les elements d'une combobox
Question sur les forms hérités[python] liste d'arguments de fonction ?
Plus de sujets relatifs à : Elements hérités dans une liste


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR