我有3个A,B和C类.C是从A和B派生的。我得到指向C类指针并转换为A **的指针,以及B **,即持有B **的变量在我的例子B中有A **的地址** BdoublePtr使用以下代码保存A **。我的地址
#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;
}
答案 0 :(得分:2)
问题是你要做的事情是不可能的;没有从C**
到B**
的有效转换。 *BdoublePtr
处的指针包含C
的地址,而不是B
的地址,您对BdoublePtr
所做的任何操作都无法改变该地址。
代码中的C风格广告等同于reinterpret_cast
;它需要C*
的值,并假装它是B*
。这给出了未定义的行为。在您的情况下,Bptr->strB
碰巧在指针所指向的A
对象中的C
对象中找到该字符串,但原则上绝对可能发生任何事情。
顺便说一句,如果你正在编写C ++,那么你真的应该使用C ++头文件和字符串。这样可以解决代码中的一些内存泄漏问题。