第五十一課 c 物件模型分析(下)

2022-06-04 23:15:13 字數 3438 閱讀 6869

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

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

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

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

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

4、virtual成員函式會被編譯器放入虛函式表中

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

1、必須實現三大特性:封裝、繼承、多型2、用void*指標保證結構體成員不被外界訪問以實現封裝3、通過父類結構體作為子類結構體的第乙個成員以實現繼承

4、用結構體來模擬虛函式表以實現多型

(1)、在類中定義虛函式表的指標

(2)、根據指標型別定義相應型別的虛函式表結構並填充相應的虛函式指標

(3)、生成子類和父類的虛函式表,由c++知虛函式表由編譯器使用,故模擬時加上static關鍵字

(4)、關聯具體物件與虛函式表

(5)、實現真正的虛函式,也是static

(6)、改造虛函式介面(在虛函式表中找到具體的實現函式)

(7)、用類似方法完善子類

#ifndef _add_h_

#define _add_h_typedef

void

demo;

typedef

void

derived;

demo* demo_create(int i, int

j);int demo_geti(demo*pthis);

int demo_getj(demo*pthis);

int demo_add(demo* pthis, int

value);

void demo_free(demo*pthis);

derived* derived_create(int i, int j, int

k);int derived_getk(derived*pthis);

int derived_add(derived* pthis, int

value);//重寫add函式

#endif

#include"

add.h

"#include

static

int demo_virtual_add(demo* pthis, int

value);

static

int derived_virtual_add(demo* pthis, int

value);

struct

vtable

;struct

classdemo

;struct

classderived

;static

struct vtable demo_virtual_table = ;//

3.生成子類和父類的虛函式表,由c++知虛函式表由編譯器使用,故模擬時加上static關鍵字

static

struct vtable derived_virtual_table = ;//3//

demo父類

demo* demo_create(int i, int

j)

return

ret;

}int demo_geti(demo*pthis)

int demo_getj(demo*pthis)

static

int demo_virtual_add(demo* pthis, int value)//

5.實現真正的虛函式

int demo_add(demo* pthis, int value)

void demo_free(demo*pthis)

//derived子類

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)

#include#include

#include

"add.h

"void run(demo* p, int

v)int

main()

1、繼承的本質就是父子間成員變數的疊加2、c++的多型是通過虛函式表來實現的3、虛函式表是由編譯器自動生成和維護的

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

51 c 物件模型分析(下)

在c 編譯器的內部類可以理解為結構體,子類是由父類成員疊加子類新成員得到的。include include using namespace std class demo class derived public demo void print struct test int main 多型是物件導向...

C 高階剖析(二十一)之物件模型分析

1.1物件模型分析 1.1.1 物件模型分析的本質 1.1.3例項 include using namespace std class test struct st int main 執行結果 1.1.4執行時物件退化成結構體的形式 總結 1.1.5 例項 下面是 cpp檔案 include inc...

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

今天來繼續學習c 物件模型!在c 編譯器內部,類可以理解為結構體 子類是由父類成員疊加子類新成員得到的 下面來寫乙個程式分析c 的繼承類的模型 include include using namespace std class demo class derived public demo void ...