一.背景
之前一直對類記憶體分布和物件真正的記憶體分布沒有清楚的理解.看到類記憶體分布時,子類中的變數有一部分是來自父類的,就認為在生成父類物件和子類物件時,他們共有的變數在記憶體上是重疊的.後來想了一下,應該不是這麼回事,就實地考察了下.
二.舉例驗證
有如下的繼承關係,有分別定義了對應的物件,考察不同物件的記憶體情況.
classbase
virtual
void
virfunc()
};class derive1 : public
base
};class derive2 : public
base
};
int得到如下的記憶體分布情況,這三個物件的記憶體是相互獨立的,並非想象中會共用記憶體.main()
注意這三個物件並不存在繼承關係,d1和d2的父類部分和b沒有一點關係(注意區分子類的父類部分和別的父類物件),他們是相互獨立的三個物件.它們儲存的虛表指標的內容也是不同的.
父類引用子類物件
父類引用子類物件 package test class fruit1 string get1 父類引用子類物件 如果父類的方法可以被重寫 靜態方法不能被重寫,因為它是隨著類的建立而存在於記憶體,只有乙份 並且已經重寫,那麼呼叫的是子類的方法 反之,則呼叫父類裡的方法 public class fru...
c 中 子類物件與父類物件的記憶體關係
問題 如題。假設有父類a與子類b a例項化乙個物件a b例項化乙個物件b 那麼在記憶體中 a與b的位址關係是什麼。是他們的首位址都一樣嗎?解答 他們是沒有必然關係的。就跟你隨便生成另外兩個其他型別的變數一樣。當然,你例項化的物件b跟a有關係。b物件開頭的部分4個位元組是虛函式表,接著就是基類的資料成...
C 子類物件當父類物件使用
子類物件當父類物件使用 1 把子類物件直接賦值給父類物件 等號左邊是父類物件,等號右邊是子類物件 子類物件賦值給父類物件,僅僅把繼承自父類部分成員函式賦值給父類物件 賦值完成後等號左邊依然是乙個父類物件 derived d base b b d 把子類物件d當成父類物件來使用 父類物件不能賦值給子類...