En fait, si je resume, tu veux pouvoir stocker des choux et des carottes dans ta liste de légumes.
Et un moment, tu demandes d´éplucher un élément : or tous les légumes ne s´épluchent pas.
--> Normal que ça gueule.
If faudrait downcaster si vraiment tu veux éplucher.
Par exemple, dire :
je prendre un légume.
Si le legume est une carotte, alors je cast en carotte
et la, je peux éplucher.
Concretement, je te conseille un enum global, au dessus de ta classe globale :
enum legume_type
{
TYPE_LEGUME_GENERIC,
TYPE_LEGUME_CHOUX,
TYPE_LEGUME_CAROTTE
};
class Legume // mere
{
public:
... // tout ce que tu as déja
virtual legume_type GetType(){return TYPE_LEGUME_GENERIC;} // virtual, c´est impotant ici, cas la méthode de la classe filel sera prioritaire.
}
class Choux:public Legume
{
public:
... // tout ce que tu as déja
legume_type GetType(){return TYPE_LEGUME_CHOUX;}
}
class Carotte:public Legume
{
public:
... // tout ce que tu as déja
void Epluche();
legume_type GetType(){return TYPE_LEGUME_CAROTTE;}
}
Du coup, apres, quand tu testes :
Legume* l = myList.at(0);
if (l->GetType()==TYPE_LEGUME_CAROTTE)
{
Carotte* c = (Carotte*)l; // downcast (tu peux te servir de static_cast aussi)
c->Epluche();
}