2012-02-05 105 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 Snippet,我會附上.. – PeerPandit 2012-02-05 14:44:38

+0

你是什麼意思?派生類是它和它的父母的組合,如果這就是你要求的,那麼派生的和它自己的基地址就沒有不同的基地址。 – Joe 2012-02-05 14:46:08

+1

的#include 類基地 { 公共: 基() {printf的 ( 「\ n基極::%P \ n」 個,這一點); } 〜Base() { printf(「\ n Base ::〜Base \ n」); } }; 類明鏡:公共基地 { 公共: 明鏡() { 的printf( 「\ n明鏡:%P \ n」 個,這一點); } 〜Der() printf(「\ n Der ::〜Der \ n」); } }; int main(void) { // Base b; Der d; return 0; – PeerPandit 2012-02-05 14:47:50

回答

6

子對象包含在一所房子包含一個門的方式父對象。如果你問了房子的座標,並且我給你了門的座標,我會說得對,對嗎?特別是對於您給出的示例,其中沒有數據成員並且沒有虛擬方法:子對象和父對象不僅具有相同的地址,而且具有相同的大小。現在

,如果你使用多重繼承 - 如果Child來自Parent1Parent2派生 - 和給兩個父類的數據成員,使他們具有非零大小,然後運行一個類似的診斷,你一定會找到至多有一個父對象具有與孩子相同的地址。

最後,請注意,不同的編譯器將爲所有這樣的問題提供不同的答案:對象佈局是依賴於編譯器的。

+2

聖母神!!,+1這樣一個很好的例子:) – 2012-02-05 14:54:07

+0

像所有的技術一樣,沒有替代品一個直率的,誠實的技術解釋。一個比喻只能走到目前爲止。在這種情況下,不清楚你是在描述一個類到成員還是在你的隱喻中的基礎派生關係,這是不同的事情。此外,「父母」/「孩子」對於「基礎」/「派生」來說是一個很差的隱喻 - 後者是(在公共案例中)是「是」的關係,而小孩通常「不是」一位家長(除非你在格拉斯哥)。 – 2012-02-05 15:26:52

+0

大量的現有使用會被詛咒,呃? – 2012-02-05 15:54:07

5

假設您有一個包含兩個數據成員的基類;它會在內存中排列如下:

member1 <-- object pointer points here 
member2 

如果派生類中增加了一些更多的成員,將這樣進行佈局:

member1 <-- object pointer points here 
member2 
member3 
member4 

所以,如果你投的派生的對象鍵入基本類型指針實際上不會改變。它仍然指向內存中的相同位置。