указатель на указатель производного класса в множественном наследовании - PullRequest
0 голосов
/ 18 июня 2010

у меня есть 3 класса A, B и C. C получен из A и B. Я получаю указатель на указатель класса C и приводим к A **, и B **, переменная, которая содержит B ** имеет адрес A ** в моем примере B ** 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 Ответ

2 голосов
/ 18 июня 2010

Проблема в том, что то, что вы пытаетесь сделать, невозможно;нет действительного преобразования из C** в B**.Указатель на *BdoublePtr содержит адрес C, а не B, и ничего, что вы делаете с BdoublePtr, не может изменить это.

Приведение в стиле C в вашем коде эквивалентно reinterpret_cast;он принимает значение C* и делает вид, что это B*.Это дает неопределенное поведение.В вашем случае Bptr->strB случайно находит строку в объекте A в объекте C, на которую указывает указатель, но в принципе может произойти абсолютно все.вы пишете на C ++, тогда вам действительно следует использовать заголовки и строки C ++.Это исправит некоторые утечки памяти в вашем коде для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...