C 多型與虛函式表(一) 單繼承

2021-10-09 05:50:34 字數 3272 閱讀 8815

個人筆記,不保證嚴謹和正確☺,如有錯誤還望指出!

《c++ 多型與虛函式表(一)—— 單繼承》

《c++ 多型與虛函式表(二)—— 多繼承》

《c++ 多型與虛函式表(三)—— 重複繼承》

《c++ 多型與虛函式表(四)—— 虛繼承》

《c++ 多型與虛函式表(五)拓展—— 物件大小》

class base

;typedef void(*ptrtype)(void);

base b;

// 方法一

ptrtype* phead = (ptrtype*)(&b); // phead: 指向的是類空間首位址(即,虛函式表位址)

ptrtype* pvptr = (ptrtype*)(*phead); // pvptr: 虛函式表第乙個函式位址

ptrtype f = (ptrtype)*(pvptr+i); // 取第i+1個虛函式指標, base::f()

f(); // i = 0, 執行第1個虛函式 base::f()

long long value = *(long long *)(phead + 1); // base::value

// 方法二

ptrtype** pvtab = (ptrtype**)&b; // pvtab[0] 記憶體布局首位址,如有虛指標為虛

ptrtype f = (ptrtype)pvtab[0][0]; // 取第1個虛函式指標, base::f()

long long value = (long long)*(&pvtab[1]; // base::value

class parent 

virtual void f()

virtual void g()

virtual void h()

};

類圖

記憶體布局圖

// 基類測試

};

類圖

記憶體布局圖

// 子類繼承父類測試1

void test2()

virtual void f()

virtual void g()

virtual void h()

};class child : public parent

virtual void f()

virtual void g_child()

virtual void h_child()

};class grandchild : public child

virtual void f()

virtual void g_child()

virtual void h_grandchild()

};

類圖

記憶體布局圖

// 子類繼承父類測試2

void test3()

virtual void f()

virtual void g()

virtual void h()

};class child : public parent

virtual void f()

virtual void g_child()

virtual void h_child()

};class grandchild : public child

virtual void f()

virtual void g_child()

virtual void h_grandchild()

};// 基類測試

void test1()

// 子類繼承父類測試1

void test2()

{ typedef void(*ptrtype)(void);

child b;

ptrtype pfun = null;

ptrtype** pvtab = (ptrtype**)&b;

cout << "[0] child::_vptr->" << endl;

// 在本機測試這種情況通過判斷指標是否為空可以,但並不是所有情況都可以

for (int i = 0; (ptrtype)pvtab[0][i] != null; ++i)

{pfun = (ptrtype)pvtab[0][i];

cout << " ["

for (int i = 0; (ptrtype)pvtab[0][i]!=null; ++i)

{pfun = (ptrtype)pvtab[0][i];

cout << " ["<

C 虛函式表研究 (一) 單繼承

c 虛函式表研究 一 單繼承 本文研究單繼承情況下,c 物件的虛函式表的具體情況。所用的編譯器為vc6.0。假設有兩個類a,b,其中b由a派生出來,a含有虛函式fun1,b含有虛函式fun2 a 的定義如下 b的定義如下 測試的 如下 測試 說明 虛函式表指標 int b 虛函式表位址 int b ...

c 虛函式表與多型

本篇文章是對b站上乙個課程的筆記 對於乙個空類,其sizeof值是1 對空類加入兩個普通成員函式,其sizeof仍然是1 只有成員變數會占用記憶體空間,普通成員函式並不會占用空間 繼續加入乙個虛函式,sizeof值變成了4!這是因為,如果類中存在虛函式,則編譯器就會在類中插入乙個看不見的成員變數,也...

虛繼承與虛函式表

一 虛繼承 1 include iostream using namespace std class bvoid fb class d1 virtual public bvoid fd1 class d2 virtual public bvirtual void vd2 void fd2 class...