OVH Cloud OVH Cloud

Heritage multiple

3 réponses
Avatar
Monorom Sarin
Bonjour,

Comme il est indique en objet, j'ai un probleme d'heritage multiple.

J'ai des classes grand_mere, mere, pere, fils

Typiquement je les ai implmenter comme ca

class grand_mere
{
public:
grand_mere();
bool operator == (const grand_mere& mamie);
}

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

Donc comment faire pour pouvoir faire le cast ?

Merci

Monorom SARIN

3 réponses

Avatar
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]);

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/

Avatar
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




Avatar
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/