1、原始碼
#include #include class base
public:
int bi_;
};class a : public base
public:
virtual void func() {};
public:
int i_;
};int main()
2、結果
base 的 this 指標:004ff9b4
a 的 this 指標:004ff9b0
a 的大小 = 12
a::bi_ = 0
a::i_ = 8
看上述**的執行結果,發現了很有意思的事情:物件 a 中的父類和子類的 this 指標的值是不一樣的。根據之前的分析結果,我們可以知道物件 a 的記憶體布局如下:
同時,**的執行結果中顯示,bi_ 變數的偏移位址為0,所以我們可以推測,該偏移位址是相對於類 base 的 this 指標的。而 i_ 偏移位址為8,其是相對於類 a 的。
綜上所述,物件訪問成員變數的方法如下:
注意,上述的操作均是由編譯器完成!
(saw:game over!)
Cpp 物件模型探索 不能被繼承的類
兩種方法 c 11 final 關鍵字 友元類 虛繼承。栗子class a friend class b class b virtual public a 我們的目的是讓 b 成為乙個不能被繼承的類。分析 由於 b 是 a 的友元,所以即使 a 的建構函式是私有的,b也是可以呼叫的,所以 b 繼承 ...
探索C 物件模型
前兩篇部落格主要了解了多型和繼承的基礎,可是當我們在學習多型和繼承的時候,難免會碰到很多關於c 物件模型的問題,例如菱形繼承中的資料冗餘如何解決,虛基表是如何解決菱形繼承中資料冗餘問題等,這一篇部落格我們以c 中多型與繼承為基礎,探索c 物件模型。首先我們先來看看虛函式,虛函式就是在函式名前面加vi...
Cpp 物件模型探索 多重繼承虛函式表分析
include class base1 virtual void func12 virtual void func13 virtual void func14 class base2 virtual void func22 virtual void func23 class son public b...