個人筆記,不保證嚴謹和正確☺,如有錯誤還望指出!
《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...