對於上面這個Point類,在內存中是怎麼布置起來的呢?
根據以上這些問題,我們可以給出如下的對象布局方式:
這裡使用了二層繼承 ZooAnimal <--- Bear <--- Panda.
思考下面這段代碼,在內存中的布局是怎樣的呢?
ZooAnimal *pza; Panda *pp = Panda = &
根據注釋上所說,我們在內存中的相應的位置,按順序設想一下該段代碼執行後內存中棧和堆的布局情況:
這個圖中並沒有考慮棧和堆的增長方向不同的因素,所以這裡也就不深究。
棧中發生了什麼很容易看得出,我們著重看一下在堆中的Panda對象的內存分布:
發現Panda對象被分成了三個部分,Panda對象 = Panda對象自己的一部分+Bear對象部分(Bear對象部分 = Bear對象自己的一部分 +基類ZooAnimal部分)
在棧中的Bear對象也是同樣的道理。
由此圖,我們大致了解了子類在內存中的布局。
因此,父類和子類之間的類型轉換,即多態的實現,就可以認為是指針的覆蓋范圍的變換,而對內存布局沒有影響。
簡單探討了一下對象在內存中的布局問題,以及如果通過布局來實現繼承和多態的。
如果不正確的地方歡迎指正。
參考資料:
《深入理解C++對象模型》