Liste et objets polymorphes
Bonjour,
Plutôt qu'un long discours voici un exemple de ma problématique :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <iostream>
#include <stdlib.h>
#include <list>
using namespace std;
struct Base
{
virtual string foo() const { return "Base"; }
};
struct Derived : public Base
{
string foo() const { return "Derived"; }
};
void bar(const list<Base*>& myList)
{
const Base* element;
for (list<Base*>::const_iterator it = myList.begin(); it != myList.end(); it++)
{
element = (const Base*)*it;
cout << element->foo() << endl;
}
cout << endl;
}
int main()
{
Base base;
Derived derived;
Base& baseDerived = derived;
list<Base*> baseList;
baseList.push_back(&base);
baseList.push_back(&derived);
baseList.push_back(&baseDerived);
list<Derived*> derivedList;
derivedList.push_back(&derived);
cout << "--- baseList : " << endl;
bar(baseList);
cout << "--- derivedList : " << endl;
bar(derivedList); // Ne compile pas
return EXIT_SUCCESS;
} |
Comme vous pouvez le voir, l'avant dernière ligne ne compile pas, car les types ne correspondent pas.
Je pourrais bien entendu passer par une fonction template mais dans ce cas je perds l'intérêt du typage et n'ai plus la garantie que les objets de la liste possèdent bien une méthode "foo()"...
Je voudrais donc savoir si je m'y prends mal ou s'il y a une manière d'obtenir un résultat similaire en profitant des avantages du typage.
Dans mon cas concret j'ai une classe abstraite XmlObject, elle contient deux méthodes virtuelles pures pour charger et écrire un objet en XML.
Bien sûre je n'ai jamais un seul objet du même type, je les stock donc dans des listes.
J'aurais donc voulu pouvoir faire une méthode statique donc le prototype serait du genre :
void fromXml(std::list<XmlInterface*>& list, const std::string& filePath);
Mais comme on le constate dans l'exemple épuré ci-dessus, cela ne fonctionne pas...
Merci de votre aide, bonne journée.