2010-06-18 6 views
-3

J'ai 3 classes A, B et C. C est dérivé de A et B. je reçois un pointeur vers le pointeur de la classe C et transtypage vers A **, et B * *, la variable qui maintiennent le B ** a l'adresse de A ** dans mon exemple B ** BdoublePtr tenir l'adresse d'un ** .i je utilise le code suivant
pointeur vers pointeur de classe dérivée dans l'héritage multiple

#include "conio.h" 
#include "stdio.h" 
#include "string.h" 

class A 
{ 
public: 
    A() 
    { 
     strA=new char[30]; 
     strcpy(strA,"class A"); 
    } 
    char *strA; 
}; 


class B 
{ 
public: 
    B() 
    { 
     strB=new char[30]; 
     strcpy(strB,"class B"); 
    } 
    char *strB; 
}; 

class C : public A, public B 
{ 
public: 
    C() 
    { 
     strC=new char[30]; 
     strcpy(strC,"class C"); 
    } 
    char *strC; 
}; 

int main(void) 
{ 
    C* ptrC=new C(); 
    A * Aptr=(A*)ptrC; 
    printf("\n class A value : %s",Aptr->strA); 

    B * Bptr=(B*)ptrC; 
    printf("\n class B value :%s",Bptr->strB); 

    printf("\n\nnow with double pointer "); 
    A ** AdoublePtr=(A **)&ptrC; 
    Aptr=*AdoublePtr; 
    printf("\n class A value : %s",Aptr->strA); 

    B * * BdoublePtr=(B **)&ptrC; 
    Bptr=* BdoublePtr; 
    printf("\n class B value : %s",Bptr->strB); 

    getch(); 
    return 0; 
} 
+3

Pourriez-vous poster votre code sans le balisage html supplémentaire, et soit indenter le tout par quatre espaces ou appuyez sur le bouton de code afin qu'il apparaisse formaté? –

+3

Poser une question dans votre question. –

+2

Je ne vois pas de question ici, mais l'utilisation de moulages de style C en conjonction avec l'héritage multiple est presque certainement aller mal. Utilisez 'static_cast' ou' dynamic_cast' à la place. –

Répondre

2

le problème est que ce que vous essayez de faire est impossible; il n'y a pas de conversion valide de C** à B**. Le pointeur à *BdoublePtr contient l'adresse d'un C, pas un B, et rien que vous faites à BdoublePtr ne peut changer cela.

La distribution de type C dans votre code est équivalente à reinterpret_cast; il prend la valeur de C* et prétend que c'est un B*. Cela donne un comportement indéfini. Dans votre cas, Bptr->strB trouve la chaîne dans l'objet A dans l'objet C pointé vers le pointeur, mais en principe tout peut arriver. À propos, si vous écrivez en C++, alors vous devriez vraiment utiliser les en-têtes et les chaînes C + +. Cela permettrait de corriger certaines des fuites de mémoire dans votre code pour commencer.

Questions connexes