2011-03-04 4 views
0

가정하자 나는 다음과 같은 계층 구조를 가지고 :간단한 상속 문제

class A 
{ 
public: 
A() 
private: 
int aa; 
} 

class B: public A 
{ 
public: 
B() 
private: 
int bb; 
} 

class D: public B 
{ 
public: 
D() 
private: 
int dd; 
} 

난에 다음 코드를 입력 내 주요 :이다

D dobj; 
std::cout<<"Address of D object: "<<&dobj<<std::endl; 

A aobj = static_cast<A>(dobj); 
A* aptr = static_cast<A*>(&dobj); 

std::cout<<"Address of D object: "<<&dobj<<std::endl; 
std::cout<<"Address of aptr object: "<<&aptr<<std::endl; 
std::cout<<"Address of A object: "<<&aobj<<std::endl; 

출력있는 :

Address of dobj object: 0012FF0C 
Address of dobj object: 0012FF0C 
Address of aptr object: 0012FF18 
Address of aobj object: 0012FF14 

aptr과 aobj의 주소가 다른 이유는 무엇입니까 ?? 그들은 동일하게되어 있지 않습니까 ??

dobj와 aptr의 주소가 다른 이유는 무엇입니까 ?? 그들도 똑같이 있어야하지 않니 ??

VC++를 사용하여 Windows에서 컴파일 중입니다.

감사합니다. De Costo.

답변

6

aptr&aobj이 다른가요?

첫째, 잘못된 포인터를 인쇄 : &aptr는 "aptr의 주소,"아니다 "개체에 aptr 점의 주소." "aptr가 가리키는 대상의 주소"를 인쇄하려면 aptr 만 인쇄하면됩니다. 이는 실제로 수행하려는 것으로 추정됩니다.

aptrA 부분에 대한 포인터이고 dobj입니다. aobjA 부분의 부분이 dobj입니다.

aptr&aobj은 서로 다른 객체의 주소이기 때문에 서로 다릅니다.

+0

@de costo : 첫째로, 캐스트는 불필요합니다 : 암시 적으로'D *'를'A *'로 변환 할 수 있습니다. 그래서'aptr = dptr; '이라고 말할 수 있습니다. 이 포인터는 같은 값을 가질 수 있습니다 :'aptr'은'D' 오브젝트의'A' 기본 클래스 부분을 가리 킵니다. 'A' 기본 클래스 부분이'D' 객체의 시작 부분에 있다면'aptr'은'dptr'와 같습니다. –

+0

내 잘못 !! Bptr = static_cast (&dobj);) aptr과 bptr의 주소가 동일합니다. bptr이 D 개체의 B 부분을 가리키고 있고 이후 bptr이 B 포인터를 가리키는 경우 B 기본 클래스가 D 객체의 시작 부분에 있지 않으므로 aptr과 bptr가 달라야합니까? –

+0

@de costo : B 클래스는 [기본 클래스] [bb 멤버]와 같이 메모리에 배치됩니다. ]와'D' 클래스는'[B base class] [dd member]'와 같이 메모리에 배치됩니다. 이렇게하면'D x;'가 주어지면 다음 세 가지 모두 같은 주소를 갖게됩니다 : (1) (2)'static_cast (x)''(3)'static_cast (x)'Visual C++ (또는 대부분의 다른 컴파일러)를 사용하여 컴파일하는 경우 다음과 같은 단일 상속 계층 구조 당신이 보여 주면, 기본 클래스는 항상 파생 된 클래스의 시작 부분에 위치해야합니다 (끝내고 내려 가기 위해 싸게 끝납니다 itance 계층 구조). –