2010-06-18 2 views
-3

3 개의 클래스 A, B 및 C가 있습니다. C는 A와 B에서 파생됩니다. 클래스 C의 포인터에 대한 포인터를 가져 와서 A *로 캐스팅하고 B * *의하여 B를 누르고 변수 **는 .I이
다중 상속의 파생 클래스 포인터에 대한 포인터

#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

여분의 html 마크 업없이 코드를 게시하고 4 개의 공백만큼 들여 쓰기하거나 코드 버튼을 눌러 포맷 된 것처럼 보일 수 있습니까? –

+3

질문하기. –

+2

여기에 질문이 없지만 C-style 캐스트를 다중 상속과 함께 사용하면 거의 확실하게 잘못 될 것입니다. 대신에'static_cast' 또는'dynamic_cast'를 사용하십시오. –

답변

2

이 문제는 다음 코드를 사용하고 ** ** BdoublePtr가의 주소를 잡아 내 예를 들어 B에서 **의 주소를 가지고 네가하려는 일은 불가능하다. C**에서 B**으로 유효한 변환이 없습니다. *BdoublePtr에있는 포인터에는 이 아닌 C의 주소가 포함되어 있으며 BdoublePtr의 주소는 변경할 수 없습니다.

코드에서 C 스타일의 캐스트는 reinterpret_cast과 같습니다. C* 값을 받아 B* 인 것처럼 가장합니다. 이렇게하면 정의되지 않은 동작이 발생합니다. 귀하의 경우 Bptr->strB은 포인터가 가리키는 C 개체의 A 개체에서 문자열을 찾지 만 원칙적으로 모든 것이 발생할 수 있습니다.

그런데 C++을 작성한다면 C++ 헤더와 문자열을 사용해야합니다. 그러면 처음부터 코드에서 메모리 누수가 수정됩니다.

관련 문제