Héritage multiple et reinterpret_cast [Résolu]

Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- - Dernière réponse : vecchio56
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
- 4 mai 2006 à 22:37
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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Dernière intervention
19 mars 2015
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 104 internautes nous ont dit merci ce mois-ci

Commenter la réponse de mogwai93
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Dernière intervention
28 février 2008
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 104 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Taron31
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Dernière intervention
19 mars 2015
0
Merci
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.....
Commenter la réponse de mogwai93
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Dernière intervention
19 mars 2015
0
Merci
j'oubliais :
c'est D qui hérite de A pas l'inverse , d'où le message : "exists, but is inaccessible"
Commenter la réponse de mogwai93
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
0
Merci
En fait ma classe A ne contient aucune donnée. Du coup ca change quelque chose?
Commenter la réponse de vecchio56
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Dernière intervention
19 mars 2015
0
Merci
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
Commenter la réponse de mogwai93
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
0
Merci
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?
Commenter la réponse de vecchio56
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
0
Merci
OK, merci beaucoup (juste à la fin, tu voulais dire A, pas E, non?)
Commenter la réponse de vecchio56
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Dernière intervention
19 mars 2015
0
Merci
non, E !



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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.