C 多型和物件的記憶體布局 二

2021-10-02 11:46:11 字數 4729 閱讀 8205

程式輸出:

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