Héritage multiple et reinterpret_cast

[Résolu]
Signaler
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
C'est une des premières fois que je me frotte à l'héritage multiple, et je me trouve devant un petit problème:
Je prends un exemple très simple:

class A {};

class B: public A {};

class C: public A {};

class D: public B, C {};

int main()
{
A* a = new D();
}

Ce code me donne deux erreurs:
error C2594: 'initializing' : ambiguous conversions from 'D *' to 'A *'
error C2243: 'type cast' : conversion from 'D *' to 'A *' exists, but is inaccessible

Par contre ca passe bien avec un reinterpret_cast
A* a = reinterpret_cast(new D());

Je me demande si c'est bien comme ca qu'il faut faire, et que fait exactement ce reinterpret_cast?
Merci

11 réponses

Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

pour ton dernier exemple : (tu obtiens donc un pentagone avec une lettre à chaque angle)

on obtient donc :
class A{};

class B : public virtual A{};

class C : public virtual A{};

class D : public B {};

classe E : public D, public C{};

tu mets virtual sur pour les classes qui sont susceptibles d'etre en double lors de l'instanciation de la classe finale (ici E)
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Tu as l'erreur error error C2594: 'initializing' : ambiguous conversions from 'D *' to 'A *' parce que le compilo ne sait pas comment convertir de D* vers A*, il peut soit passer par B soit par C, outre que d'utiliser les mots-clefs virtual, tu pouvais passer par un intermédiaire :

B *pb = new D();
A *pa = static_cast(pb);

___________________
MVS - Most Valuable Student ( Microsoft)
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

je dirais plutot qu'il faut rajouter virtual, comme ceci (sinon tu te retrouves avec 2 instances de A lors de la creation de D)

class A{};

class B : public virtual A{};

class C : public virtual A{};

class D : public B, public C{};

pour reinterpret_cast : je connais pas.....
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

j'oubliais :
c'est D qui hérite de A pas l'inverse , d'où le message : "exists, but is inaccessible"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
En fait ma classe A ne contient aucune donnée. Du coup ca change quelque chose?
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

ton code :
http://img439.imageshack.us/img439/3769/heritagemultiple019ss.gif

ce que je te propose :
http://img288.imageshack.us/img288/4931/heritagemultiple027xl.gif

pour ton test, ca ne change pas grand chose , juste un peu + de memoire utilisée...
par la suite ca peut gener, car tu peux toucher l'une des 2 classes A
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
En fait, ma hiérarchie est un peu différente:
E hérite de C et D
D hérite de B
B et C héritent de A

Du coup, quels héritagent doivent être virtuels?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
OK, merci beaucoup (juste à la fin, tu voulais dire A, pas E, non?)
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

non, E !



car c'est quand tu vas instancier E que tu risques d'avoir 2 A (si tu ajoutes ou non "virtual")
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Ah oui d'accord, je pensais que tu parlais de la classe pouvant être en double
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Merci pour cette précision