class mere : public grand_mere
{
public:
mere();
bool operator == (const grand_mere& mamie);
bool operator == (const mere& maman);
}
class pere : public grand_mere
{
public:
pere();
bool operator == (const grand_mere& mamie);
bool operator == (const pere& papa);
}
class fils : public mere, public pere
{
public:
fils();
}
Le probleme est l'amibguite levee par l'operateur == de fils.
J'ai vu qu'en faisant de l'heritage virtuel de grand mere sur pere et mere
on arrive a resoudre cette ambiguite.
class pere : public grand_mere -> class pere : public virtual grand_mere
class mere : public grand_mere -> class mere : public virtual grand_mere
Maintenant, j'ai un vecteur de pointeur de grand_mere vector<grand_mere*>
appele vecteur.
Dans vecteur, je stocke des pointeurs vers des objets de classe mere, pere
et fils.
Le probleme est quand je veux faire un cast sur ces pointeurs. En effet,
quand je prends un element du vecteur, j'obtiens un pointeur vers un objet
de type grand_mere. Or il se trouve (apres verification) qu'il sagit d'un
pointeur vers un objet de type pere. Cela se traduit par exemple par :
pere papa = (pere*) vecteur[10]; // le compilateur genere une erreur
Comme il est indique en objet, j'ai un probleme d'heritage multiple. [...] Donc comment faire pour pouvoir faire le cast ?
Il faut utiliser "dynamic_cast" :
pere* papa = dynamic_cast <pere*>(vecteur[10]);
Il me semble (à confirmer !) qu'un cast simple "à la C" est équivalent à un "static_cast", qui ne fonctionne pas ici (héritage multiple).
Vincent
-- vmime, une bibliothèque C++ sous licence GPL pour parser et générer des messages au format MIME : http://www.sourceforge.net/projects/vmime/
Alexandre
<snip>
Maintenant, j'ai un vecteur de pointeur de grand_mere vector<grand_mere*> appele vecteur. Dans vecteur, je stocke des pointeurs vers des objets de classe mere, pere et fils. Le probleme est quand je veux faire un cast sur ces pointeurs. En effet, quand je prends un element du vecteur, j'obtiens un pointeur vers un objet de type grand_mere. Or il se trouve (apres verification) qu'il sagit d'un pointeur vers un objet de type pere. Cela se traduit par exemple par : pere papa = (pere*) vecteur[10]; // le compilateur genere une erreur
Ce qui est normal. Tu prends vecteur[10], qui est un grand_mere*, tu le convertis en pere* et tu veux le stocker dans papa qui est un pere... ça ne peut pas marcher (pere != pere*). Si papa était un pere*, le cast serait violent mais correct. Au passage, un cast "dynamique" serait plus propre : pere *papa = dynamic_cast<pere*>(vecteur[10]); // maintenant soit papa est égal à 0, soit pointe au même endroit que vecteur[10] *mais* en étant du type pere*.
Ceci dit, essayes de voir si ton cast est vraiment nécessaire ou si une méthode virtuelle dans grand_mere, redéfinie dans pere ne serait pas + propre.
Donc comment faire pour pouvoir faire le cast ?
Merci
Monorom SARIN
<snip>
Maintenant, j'ai un vecteur de pointeur de grand_mere vector<grand_mere*>
appele vecteur.
Dans vecteur, je stocke des pointeurs vers des objets de classe mere, pere
et fils.
Le probleme est quand je veux faire un cast sur ces pointeurs. En effet,
quand je prends un element du vecteur, j'obtiens un pointeur vers un objet
de type grand_mere. Or il se trouve (apres verification) qu'il sagit d'un
pointeur vers un objet de type pere. Cela se traduit par exemple par :
pere papa = (pere*) vecteur[10]; // le compilateur genere une erreur
Ce qui est normal. Tu prends vecteur[10], qui est un grand_mere*, tu le
convertis en pere* et tu veux le stocker dans papa qui est un pere... ça ne
peut pas marcher (pere != pere*). Si papa était un pere*, le cast serait
violent mais correct. Au passage, un cast "dynamique" serait plus propre :
pere *papa = dynamic_cast<pere*>(vecteur[10]);
// maintenant soit papa est égal à 0, soit pointe au même endroit que
vecteur[10] *mais* en étant du type pere*.
Ceci dit, essayes de voir si ton cast est vraiment nécessaire ou si une
méthode virtuelle dans grand_mere, redéfinie dans pere ne serait pas +
propre.
Maintenant, j'ai un vecteur de pointeur de grand_mere vector<grand_mere*> appele vecteur. Dans vecteur, je stocke des pointeurs vers des objets de classe mere, pere et fils. Le probleme est quand je veux faire un cast sur ces pointeurs. En effet, quand je prends un element du vecteur, j'obtiens un pointeur vers un objet de type grand_mere. Or il se trouve (apres verification) qu'il sagit d'un pointeur vers un objet de type pere. Cela se traduit par exemple par : pere papa = (pere*) vecteur[10]; // le compilateur genere une erreur
Ce qui est normal. Tu prends vecteur[10], qui est un grand_mere*, tu le convertis en pere* et tu veux le stocker dans papa qui est un pere... ça ne peut pas marcher (pere != pere*). Si papa était un pere*, le cast serait violent mais correct. Au passage, un cast "dynamique" serait plus propre : pere *papa = dynamic_cast<pere*>(vecteur[10]); // maintenant soit papa est égal à 0, soit pointe au même endroit que vecteur[10] *mais* en étant du type pere*.
Ceci dit, essayes de voir si ton cast est vraiment nécessaire ou si une méthode virtuelle dans grand_mere, redéfinie dans pere ne serait pas + propre.
Donc comment faire pour pouvoir faire le cast ?
Merci
Monorom SARIN
Vincent Richard
Comme il est indique en objet, j'ai un probleme d'heritage multiple. [...] Donc comment faire pour pouvoir faire le cast ?
Il faut utiliser "dynamic_cast" :
pere* papa = dynamic_cast <pere*>(vecteur[10]);
Arf ! Je viens de voir en lisant le message d'Alexandre que c'était une erreur à la _compilation_, et que donc ma réponse était à côté de la plaque... Désolé.
Vincent
-- vmime, une bibliothèque C++ sous licence GPL pour parser et générer des messages au format MIME : http://www.sourceforge.net/projects/vmime/
Comme il est indique en objet, j'ai un probleme d'heritage multiple.
[...]
Donc comment faire pour pouvoir faire le cast ?
Il faut utiliser "dynamic_cast" :
pere* papa = dynamic_cast <pere*>(vecteur[10]);
Arf ! Je viens de voir en lisant le message d'Alexandre que c'était une
erreur à la _compilation_, et que donc ma réponse était à côté de la
plaque... Désolé.
Vincent
--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/
Comme il est indique en objet, j'ai un probleme d'heritage multiple. [...] Donc comment faire pour pouvoir faire le cast ?
Il faut utiliser "dynamic_cast" :
pere* papa = dynamic_cast <pere*>(vecteur[10]);
Arf ! Je viens de voir en lisant le message d'Alexandre que c'était une erreur à la _compilation_, et que donc ma réponse était à côté de la plaque... Désolé.
Vincent
-- vmime, une bibliothèque C++ sous licence GPL pour parser et générer des messages au format MIME : http://www.sourceforge.net/projects/vmime/