C 深度剖析教程29 C 物件模型分析下

2021-08-18 08:45:38 字數 2960 閱讀 8009

今天來繼續學習c++物件模型!

在c++編譯器內部,類可以理解為結構體

子類是由父類成員疊加子類新成員得到的

下面來寫乙個程式分析c++的繼承類的模型:

#include 

#include

using

namespace

std;

class demo

};class derived : public demo

void print()

};struct test

;int main()

(注意以上程式用編譯器是gcc編譯器,所以結構體的位元組對齊是4位元組預設)

執行結果為:

那麼久引出了問題:c++多型的實現原理是什麼?

c++多型的實現原理:

當類中宣告乙個虛函式時,編譯器會在類中生成乙個虛函式表

虛函式表是乙個儲存成員函式位址的資料結構

虛函式表是由編譯器自動生成與維護的

virtual成員函式,會被編譯器放進虛函式表中

存在虛函式時,每個物件中都有乙個指向虛函式表的指標

如下圖:

virtual成員函式,會被編譯器放進虛函式表中

存在虛函式時,每個物件中都有乙個指向虛函式表的指標

我們會發現,虛函式的呼叫過程比普通函式的呼叫過程複雜,所以虛函式的執行效率低於普通成員函式:

51-2.c為:

#include "51-2.h"

#include "malloc.h"

static

int demo_virtual_add(demo* pthis, int

value);

static

int derived_virtual_add(demo* pthis, int

value);

struct vtable // 2. 定義虛函式表資料結構

;struct classdemo

;struct classderived

;static

struct vtable g_demo_vtbl = //static關鍵字將該虛函式表隱藏在當前檔案內,外部不可見

//類似於c++中虛函式表是自動生成的,外部不可見。

;static

struct vtable g_derived_vtbl =

;demo* demo_create(int i, int j)

return ret;

}int demo_geti(demo* pthis)

int demo_getj(demo* pthis)

// 6. 定義虛函式表中指標所指向的具體函式

static

int demo_virtual_add(demo* pthis, int

value)

// 5. 分析具體的虛函式!!!!

int demo_add(demo* pthis, int

value)

void demo_free(demo* pthis)

derived* derived_create(int i, int j, int k) //等同於建構函式

return ret;

}int derived_getk(derived* pthis)

static

int derived_virtual_add(demo* pthis, int

value)

int derived_add(derived* pthis, int

value)

main.c為:

#include "stdio.h"

#include "51-2.h"

void run(demo* p, int v)

int main()

總結:繼承的本質就是父子間成員變數的疊加

c++中的多型是通過虛函式表實現的

虛函式表,是由編譯器自動生成與維護的

虛函式的呼叫效率低於普通成員函式的呼叫效率

C 深度剖析教程38 類模板深度剖析

類模板可以定義任意多個不同的型別引數 類模板可以被特化 類模板的特化型別 看 include include using namespace std template typename t1,typename t2 class test template typename t1,typename t...

深度探索C 物件模型

傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷 譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你...

深度探索C 物件模型

傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你 ...