2010-01-28 7 views
1

Doublons possibles:
C++ pointer multi-inheritance fun.
more c++ multiple inheritance funC++ héritage multiple

Ceci est un problème qui se pose de traiter avec la classe de base pointeur compté ref et filetage amusant.

Étant donné:

class A{int x, y;}; 
class B{int xx, yy;}; 
class C: public A, public B {int z;}; 
C c; 
C* pc = &c; 
B* pb = CtoB(pc); 
A* pa = CtoA(pc); 

assert(pc == AtoC(pa)); 
assert(pc == BtoC(pb)); 

Comment puis-je écrire CtoB et CTOA pour obtenir le B & A parties de C? Comment écrire en AtoC et en BtoC pour récupérer le C original?

Merci!

Pourquoi les votes se terminent?

Mes deux questions précédentes demandaient si quelque chose était valide (la réponse était «non»); cette question demande "quelle est la manière valide de faire la conversion de pointeur."

+0

Avez-vous vraiment besoin d'une 3ème question avec le même thème? http://stackoverflow.com/questions/2158512/more-c-multiple-inheritance-fun et http://stackoverflow.com/questions/2157104/c-pointer-multi-inheritance-fun – Trent

Répondre

3

Vous n'avez pas besoin de fonction, puisque C dérive une seule fois de A et B. A moins que vous dérivez de A ou B plusieurs fois (sans héritage virtuel), il vous suffit d'utiliser:

A *pbb = pc; 
B *pba = pc; 

AtoC et BtoC ne sont sûrs que par:

C *c = dynamic_cast<C*>(a_or_b_pointer); 
+0

Est-ce que pbb et pba ne pointeraient pas au même endroit alors? Si oui, comment peut-il être un "A" et un "B"? – anon

+0

Ils ne pointeront pas au même endroit. Le compilateur sait exactement de combien les déplacer lors de la transformation de C * en A */B *. Vous pouvez imprimer les pointeurs/démonter pour vérifier. – rmn

+0

En fait, j'ai un petit défi pour vous sur ce sujet, si vous êtes intéressé: http://cplusplus.co.il/2010/01/20/a-question-of-memory-layout/ – rmn

1

Pour obtenir les B & A parties de C, vous pouvez essayer:

B* pbb = static_cast<B*>(pc); 
A* pba = static_cast<A*>(pc); 

Cela devrait être en sécurité.

+0

Pour aller dans l'autre direction, dois-je lancer un casting dynamique? – anon

+0

Je viens de remarquer que cela est demandé pour 2x avec juste titre différent :) – sinek

+0

Oui, pour aller dans l'autre sens que vous utiliseriez un casting dynamique. –