Cpp 物件模型探索 物件訪問成員變數的原理

2021-10-01 05:20:44 字數 708 閱讀 7626

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...