程式輸出:
sizeof(base_1) = 12 (成員屬性 + 指向虛函式表的指標)
sizeof(derive_1) = 20 (base成員屬性 + derive成員屬性 + 指向虛函式表的指標)
base記憶體布局:
1> class base_1 size(12):
1> +---
1> 0 |
1> 4 | base1_1
1> 8 | base1_2
1> +---
base虛函式表:
1> base_1::$vftable@:
1> | &base_1_meta
1> | 0
1> 0 | &base_1::base1_fun_1
1> 1 | &base_1::base1_fun_2
derive記憶體布局:
1> class derive_1 size(20):
1> +---
1> 0 | +--- (base class base_1)
1> 0 | |
1> 4 | | base1_1
1> 8 | | base1_2
1> | +---
1> 12 | derive1_1
1> 16 | derive1_2
1> +---
derive虛函式表:
1> derive_1::$vftable@:
1> | &derive_1_meta
1> | 0
1> 0 | &base_1::base1_fun_1
1> 1 | &base_1::base1_fun_2
測試**:
#include#includeusing namespace std;
class base_1
virtual void base1_fun_2() };
class derive_1 : public base_1;
int main()
base記憶體布局:
1> class base_1 size(12):
1> +---
1> 0 |
1> 4 | base1_1
1> 8 | base1_2
1> +---
base虛函式表:
1> base_1::$vftable@:
1> | &base_1_meta
1> | 0
1> 0 | &base_1::base_1_fun_1
1> 1 | &base_1::base_1_fun_2
derive記憶體布局:
1> class derive_1 size(20):
1> +---
1> 0 | +--- (base class base_1)
1> 0 | |
1> 4 | | base1_1
1> 8 | | base1_2
1> | +---
1> 12 | derive1_1
1> 16 | derive1_2
1> +---
derive虛函式表:
1> derive_1::$vftable@:
1> | &derive_1_meta
1> | 0
1> 0 | &base_1::base_1_fun_1
1> 1 | &base_1::base_1_fun_2
1> 2 | &derive_1::derive_1_fun_1
測試**:
#include#includeusing namespace std;
class base_1
virtual void base_1_fun_2() };
class derive_1 : public base_1};
int main()
這裡只講記憶體布局,多型後續詳解
程式輸出:
sizeof(base_1) = 12
sizeof(derive_1) = 20
base記憶體布局
1> class base_1 size(12):
1> +---
1> 0 |
1> 4 | base1_1
1> 8 | base1_2
1> +---
base虛函式表
1> base_1::$vftable@:
1> | &base_1_meta
1> | 0
1> 0 | &base_1::base_1_fun_1
1> 1 | &base_1::base_1_fun_2
1>
1> base_1::base_1_fun_1 this adjustor: 0
1> base_1::base_1_fun_2 this adjustor: 0
1>
1> class std::is_error_code_enumsize(1):
1> +---
1> 0 | +--- (base class std::integral_constant)
1> | +---
1> +---
derive記憶體布局:
1> class derive_1 size(20):
1> +---
1> 0 | +--- (base class base_1)
1> 0 | |
1> 4 | | base1_1
1> 8 | | base1_2
1> | +---
1> 12 | derive1_1
1> 16 | derive1_2
1> +---
derive虛函式表
1> derive_1::$vftable@:
1> | &derive_1_meta
1> | 0
1> 0 | &derive_1::base_1_fun_1 已經被放置到第一位,&derive_1 由這個可知 derive_1生命的物件指向的是derive_1類中的函式base_1_fun_1。
1> 1 | &base_1::base_1_fun_2
測試**:
#include#includeusing namespace std;
class base_1
virtual void base_1_fun_2() };
class derive_1 : public base_1
};int main()
base記憶體布局:
1> class base_1 size(12):
1> +---
1> 0 |
1> 4 | base1_1
1> 8 | base1_2
1> +---
base虛函式表:
1> base_1::$vftable@:
1> | &base_1_meta
1> | 0
1> 0 | &base_1::base_1_fun_1
derive記憶體布局:
1> class derive_1 size(20):
1> +---
1> 0 | +--- (base class base_1)
1> 0 | |
1> 4 | | base1_1
1> 8 | | base1_2
1> | +---
1> 12 | derive1_1
1> 16 | derive1_2
1> +---
derive虛函式表:
1> derive_1::$vftable@:
1> | &derive_1_meta
1> | 0
1> 0 | &base_1::base_1_fun_1
1> 1 | &derive_1::base_1_fun_2
#include#includeusing namespace std;
class base_1
void base_1_fun_2() };
class derive_1 : public base_1
};int main()
未完待續....
c++多型和物件的記憶體布局(一)
C 多型和物件的記憶體布局 一
在當前工程右鍵 屬性 先選擇左側的c c 命令列,然後在其他選項這裡寫上 d1 reportallclasslayout,它可以看到所有相關類的記憶體布局,如果寫上 d1 reportsingleclasslayout 為類名 則只會打出指定類 的記憶體布局。成員變數是按照定義的順序來儲存的,最先宣...
C ,從RTTI聯絡多型物件記憶體布局
1 dynamic cast轉化,實現安全向下進行轉化,那麼實際上,根據vptr的指向,vtable中對應虛函式位址繫結的物件,來進行檢測以及轉化為實際的物件型別。2 typeid操作符,返回指標或者引用所指物件的實際型別。那麼關於dynamic cast,我們必須意識到,最關鍵的點在於虛表,這是多...
C 物件的記憶體布局
一篇寫的比較好的部落格 這篇文章中主要想說以下幾個問題 1 如何通過物件獲得虛函式表中虛函式的位址 2 分幾種情況討論記憶體布局 1 單一繼承 2 多重繼承 3 重複繼承 4 鑽石虛擬繼承 為了解決重複繼承中出現問題而產生的虛擬繼承 1 虛函式主要是通過一張虛函式的位址表來實現的,簡稱v table...