2012-02-05 3 views
1

파생 클래스 및 기본 클래스 개체의 주소를 찾으려고합니다. 동일한 것으로 나타납니다. 사실, 나는 둘 다의 주소를 얻는 방법을 혼란 스럽습니까?파생 클래스 및 기본 클래스 객체의 메모리 주소는 무엇입니까?

#include<stdio.h> 
class Base { 
    public: 
     Base() 
     { 
      printf ("\n Base :: %p\n", this); 
     } 
     ~Base() { 
      printf ("\n Base::~Base\n"); 
     } 
}; 

class Der:public Base { 
    public: 
     Der() { 
      printf ("\n Der: %p \n", this); 
     } 
     ~Der() { 
      printf ("\n Der:: ~Der\n"); 
     } 
}; 

int main(void) { 
    Base b; 
    Der d; 
    return 0; 
} 
+0

CODE 스 니펫, 첨부하겠습니다. – PeerPandit

+0

무엇을 의미합니까? 파생 클래스는 부모 클래스와 부모 클래스의 합성어입니다. 파생 된 기본 주소와 자체 기본 주소가 서로 다르지 않습니다. – Joe

+1

#INCLUDE 수준의 자료 { 공개 : 자료() { 의 printf ("\ n 자료 : % P \ 없음"이); } ~ Base() { printf ("\ n Base :: ~ Base \ n"); } }; 클래스 데르 : 공공 자료 { 공개 : 데르() { 의 printf ("\ n 데르 % P \ 없음"이); } ~ Der() { printf ("\ n Der :: ~ Der Der n"); } }; int 메인 (무효) { //베이스 b; Der d; return 0; – PeerPandit

답변

6

자식 객체 는 집 문을 포함하는 방식 부모 개체가 포함되어 있습니다. 네가 집의 좌표를 물어봤을 때 내가 문 좌표를 주었다면, 맞을거야, 네? 특히 데이터 멤버가없고 가상 메서드가없는 예를 들면 : 자식 및 부모 개체는 동일한 주소를 가질뿐만 아니라 크기가 같습니다. 당신이 다중 상속을 사용하는 경우

지금 - ChildParent1Parent2 모두에서 파생하는 경우 - 그리고 그들은 제로가 아닌 크기가 그래서 모두 상위 클래스를 데이터 멤버를 제공하고 유사한 진단을 실행, 당신은 확실히 찾을 수 있습니다 부모 객체 중 하나만 자식과 동일한 주소를가집니다.

마지막으로, 다른 컴파일러가 이와 같은 모든 질문에 대해 다른 대답을 줄 것이라는 점에 유의하십시오. 객체 레이아웃은 컴파일러에 따라 다릅니다.

+2

신의 거룩한 어머니 !!, 좋은 예를 들어 +1 : –

+0

기술적 인 것과 마찬가지로, 대체 할만한 것도 없습니다. 똑바로, 정직하고, 기술적 인 설명. 은유는 지금까지 간다. 이 경우, 메타포에서 클래스 대 구성원 또는 기본에서 파생 관계를 설명하는지 여부는 분명하지 않습니다. 이는 서로 다른 것입니다. 또한, "부모"/ "자식"은 "기본"/ "파생 된"에 대한 매우 가난한 은유이다. 후자는 (공공의 경우에는) "is-a"관계이고, 보통 어린이는 " 학부모 (글래스고에 있지 않는 한). –

+0

기존 사용법의 광대 한 범위는 저주받을 수 있습니까? –

5

두 개의 데이터 멤버가있는 기본 클래스가 있다고 가정합니다. 다음과 같이 메모리에 배치됩니다 : 당신은 유도의 개체를 캐스팅한다면

member1 <-- object pointer points here 
member2 
member3 
member4 

: 파생 클래스는 다음과 같이 배치됩니다 몇 가지 더 많은 회원을 추가

member1 <-- object pointer points here 
member2 

경우 포인터가 실제로 변경되지 않는 기본 유형을 입력하십시오. 그것은 여전히 ​​메모리에있는 같은 장소를 가리키고 있습니다.

관련 문제