Voilà mon problème :
J'ai une classe B qui dérive d'une classe A.
J'ai besoin d'en faire une "liste", je fais donc un vector<A> qui contient des A et des B, j'ai lu que c'était autorisé.
Seulement, lorsque je veux accéder à une méthode d'une occurence d'une classe fille B contenue dans mon vector, le compilo me crache que cette méthode n'appartient pas à A, la classe mère. Logique, puisque le vector est du type de A...
Ma question : comment contourner le problème? N'est-il pas possible de faire une "liste" de classes mères et filles confondues?
Tu peut 'outrepasser' le problème grâce au polymorphisme.
Exemple :
#include <iostream>
#include <vector>
usingnamespace std;
class Shape
{
public:
virtualvoid SeDessiner(void) =0; //methode virtuelle pure pour éviter l'instanciation
};
class Carre : public Shape
{
virtualvoid SeDessiner(){cout<< "Je suis un carre" ;}
};
class Cercle : public Shape
{
virtualvoid SeDessiner(){cout<< "Je suis un cercle" ;}
};
int main(void)
{
vector<Shape*> v;
v.push_back(new Carre);
v.push_back(new Cercle);
constint size = v.size();
for(int i=0;i<size;i++)
{
v[i]->SeDessiner(); // <-- ici le polymorphisme
}
for(int i=0;i<size;i++)
{
delete v[i];
}
return0;
}
L'inconvénient , c'est qu'il faut que ce soir les même nom de méthodes entre ta classe de base et sa dérivé.
Sinon tu peut de bouffer des static_cast a tout va , mais ca va être lourd et pas très sure.
Le probleme, si tu as un vector<A>, si tu y injectes une classe B, qui contient donc A+la partie B, il va y avoir upcasting, autrement dit, ta classe B va etre castée en A.
--> Ta partie B est perdue : elle ne sera pas rangée dans le vector.
si tu recuperes ton element dans un B (downcasting, car tu cast un A en B), alors tu pourras avoir n'importe quoi dans ta "partie B"...
bref, c'est pas bon.
Ok, merci à vous, je vais me tourner vers un tuto sur le polymorphisme. Jusque là, je me demandais à quoi ca servait, mais c'est en étant confronté au problème que l'on s'en rend compte!
Citation : Fvirtman
Le probleme, si tu as un vector<A>, si tu y injectes une classe B, qui contient donc A+la partie B, il va y avoir upcasting, autrement dit, ta classe B va etre castée en A.
--> Ta partie B est perdue : elle ne sera pas rangée dans le vector.
J'y ai pensé lorsque j'ai lu qu'on pouvait faire ca, et ca me paraissait bizarre. Maintenant que tu me dis que B est perdue, ca me semble logique!
Pour être simple : le polymorphisme c'est faire passer des instances de classes filles pour des instances de classes mères.
Cependant, pour pouvoir s'en servir dans ton vector par exemple, il faut utiliser soit des références sur A (A&) soit des pointeurs sur A (A*) .
(oui c'est vrai, car les références doivent être initialisées à la création)
Problème d'héritage
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html