多继承中派生类的指针指针

时间:2010-06-18 10:08:38

标签: c++ pointers

我有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;
}

1 个答案:

答案 0 :(得分:2)

问题是你要做的事情是不可能的;没有从C**B**的有效转换。 *BdoublePtr处的指针包含C的地址,而不是B的地址,您对BdoublePtr所做的任何操作都无法改变该地址。

代码中的C风格广告等同于reinterpret_cast;它需要C*的值,并假装它是B*。这给出了未定义的行为。在您的情况下,Bptr->strB碰巧在指针所指向的A对象中的C对象中找到该字符串,但原则上绝对可能发生任何事情。

顺便说一句,如果你正在编写C ++,那么你真的应该使用C ++头文件和字符串。这样可以解决代码中的一些内存泄漏问题。