Bonjour !
J'ai lu pas mal de tutoriels sur le sujet des méthodes virtuelles, mais j'avoue buter sur un problème venu de l'espace (dont la solution, comme d'habitude, doit être évidente...).
J'ai deux classes "Livre" et "Article" qui héritent de la classe de base "Document". Document contient une méthode virtuelle afficher(), implémentée par ses deux filles.
J'ai une classe "Biblio" qui contient une "list<Document>", où j'ajoute des livres et des articles.
Cependant, quand je prend un objet de cette liste (que je parcours avec un "iterator") et que j'appelle), c'est la méthode afficher() de la classe mère qui est appelée !
Code : Sélectionner tout - Visualiser dans une fenêtre à part it -> afficher(
Je croyais avoir compris le système des méthodes virtuelles, mais là j'avoue ne rien y comprendre. J'ai pas mal planché sur ce problème, mais je ne vois pas :
- it est bien un pointeur vers un objet "Article" ou "Livre"
- Ce sont bien des instances des classes filles que j'ai "push_back"
- Mes méthodes ont bien été déclarées "virtual" dans le .h de la classe mère (et des classes filles au cas où).
Non, sérieusement, je ne vois pas... Je suppose que dans ma "list" il doit y avoir un moment où mes instances de classes filles deviennent des "Document", mais comment ?
Je vous remercie par avance, et encore félicitations pour ce forum qui m'a tant aidé par le passé
Mithryl.
PS : Voici les extraits de code des fonctions
Biblio.h
Biblio.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 void ajouter(Document *D); void afficher();
Article.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void Biblio::ajouter(Document *D){ tab.push_back(*D); } void Biblio::afficher(){ for (list<Document>::iterator it = tab.begin(); it !=tab.end(); it++) it->afficher(); }
Article.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 virtual void afficher() const;
Document.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void Article::afficher() const{ this -> Document::afficher(); cout << "Revue : " << revue << endl; cout << "Editeur : " << editeur << endl; cout << "Numero d'édition : " << numeroEdition << endl << endl; }
Document.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part virtual void afficher() const;
Et enfin, le main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void Document::afficher() const{ cout << endl << "DOCUMENT : " << endl; cout << "Titre : " << titre << endl; cout << "Resume : " << *resume <<endl; cout << "Auteur : " << auteur <<endl; }
J'ai omis quelques fonctions (constructeurs, etc) et quelques fichiers (Livre.cpp, ...), si vous en avez besoin je vous mettrai le tout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Article* article = new Article("Titre", new string("Resume"), "Auteur", "Revue", "Editeur", 2005); Livre* livre = new Livre("TitreL", new string("ResumeL"), "AuteurL", "EditeurL", 2010); Biblio* biblio = new Biblio(); biblio->ajouter(article); biblio->ajouter(livre); biblio->afficher();
Partager