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.
@de costo : 첫째로, 캐스트는 불필요합니다 : 암시 적으로'D *'를'A *'로 변환 할 수 있습니다. 그래서'aptr = dptr; '이라고 말할 수 있습니다. 이 포인터는 같은 값을 가질 수 있습니다 :'aptr'은'D' 오브젝트의'A' 기본 클래스 부분을 가리 킵니다. 'A' 기본 클래스 부분이'D' 객체의 시작 부분에 있다면'aptr'은'dptr'와 같습니다. –
내 잘못 !! Bptr = static_cast (&dobj);) aptr과 bptr의 주소가 동일합니다. bptr이 D 개체의 B 부분을 가리키고 있고 이후 bptr이 B 포인터를 가리키는 경우 B 기본 클래스가 D 객체의 시작 부분에 있지 않으므로 aptr과 bptr가 달라야합니까? –
@de costo : B 클래스는 [기본 클래스] [bb 멤버]와 같이 메모리에 배치됩니다. ]와'D' 클래스는'[B base class] [dd member]'와 같이 메모리에 배치됩니다. 이렇게하면'D x;'가 주어지면 다음 세 가지 모두 같은 주소를 갖게됩니다 : (1) (2)'static_cast (x)''(3)'static_cast (x)'Visual C++ (또는 대부분의 다른 컴파일러)를 사용하여 컴파일하는 경우 다음과 같은 단일 상속 계층 구조 당신이 보여 주면, 기본 클래스는 항상 파생 된 클래스의 시작 부분에 위치해야합니다 (끝내고 내려 가기 위해 싸게 끝납니다 itance 계층 구조). –