Méthodes virtuelles (again)
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 !
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
Code:
1 2 3
|
void ajouter(Document *D);
void afficher(); |
Biblio.cpp
Code:
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.h
Code:
1 2
|
virtual void afficher() const; |
Article.cpp
Code:
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.h
Code:
virtual void afficher() const;
Document.cpp
Code:
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;
} |
Et enfin, le main.cpp
Code:
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(); |
J'ai omis quelques fonctions (constructeurs, etc) et quelques fichiers (Livre.cpp, ...), si vous en avez besoin je vous mettrai le tout :)