假設是32位機器。
在這裡,解釋一下虛函式表(virtual table 或稱為vtbl),虛函式指標( virtual pointer 或者稱為 vptr)的內部工作原理。
首先,我們必須了解一下記憶體布局。
例一:類的記憶體布局
#include
using
namespace
std;
class test;
int main()
輸出結果:
sobj's size = 8
obj 's address = 0012ff7c
注意:任何的成員函式都不會占用任何的記憶體。
例二 :派生類的記憶體布局
// 父類
class test;
// 派生類
class dtest : public test;
int main()
輸出結果:
obj1's size = 8
obj1's address = 0012ff78
obj2's size = 12
obj2's address = 0012ff6c
例三 : 帶有虛函式類的記憶體布局
// 帶有虛函式的類
class test
};int main()
輸出結果:
obj's size = 8
obj's address = 0012ff7c
注意:在類中新增虛函式會產生額外的負擔(4byte)
例四:不止乙個虛函式
class test
virtual
void fun2()
virtual
void fun3()
virtual
void fun4()
};int main()
輸出結果:
obj's size = 8
obj's address = 0012ff7c
注意:如果乙個類中有虛函式的前提下,再增加虛函式就不會產生額外的記憶體負擔。仍然產生額外的4byte負擔。
例五:
class test
int geta()
int getb()
virtual ~test();
};int main()
輸出結果:
a = 200
b = 10
如果作如下修改:
// changing a and b
int* pint = (int*)&obj;
*(pint+1) = 100; // in place of 0
*(pint+2) = 200; // in place of 1
輸出結果:
a = 100
b = 200
注意:位於class第一位置是vptr,其他都位於其後面。
(who sits 1st place of class : answer is vptr,vptr - 1st placed in class and rest sits after it. )
例六:
class test
};int main()
輸出結果:
vptr's address 0012ff7c
vptr's value 0046c060
例七:
class test
};typedef
void (*fun)(void);
int main()
輸出結果:
vptr's address 0012ff7c
virtual table 's address 0046c0ec
value at first entry of virtual table 0040100a
test: fun1
例八:
class test
virtual
void func1()
};int main()
輸出結果:
vptr's address 0012ff7c
virtual table 's address 0046c0ec
value at first entry of virtual table 0040100a
value at 2nd entry of virtual table 004012
例九:
class test
virtual
void func1()
};typedef
void(*fun)(void);
int main()
輸出結果:
test::fun1
test::func1
例十:
class base1;
class base2;
class base3;
class derive : public base1, public base2, public base3;
int main()
輸出結果:
derive's size = 12
例十一:
class base1
virtual
void func1()
};class base2
virtual
void func1()
};class base3
virtual
void func1()
};class derive : public base1, public base2, public base3
virtual
void fnc()
};typedef
void(*fun)(void);
int main()
輸出結果:
base1::fun
base1::func
base2::fun
base2::func
base3::fun
base3::func
drive::fn
drive::fnc
順便提一下函式指標:
int i;
定義了乙個int型別的變數i;
而這樣
typedef int int;
表示使用者自己定義了乙個整型資料型別int,實際上就等同於int
所以:int ii;
同上,表示定義了乙個int型別的變數ii;
同理可得:
typedef void (*fun)(void);
表示使用者自己定義了乙個函式指標資料型別 ,該函式指標指向 類似void foo(void)函式的函式入口位址
fun pf;
表示定義了乙個函式指標pf,該函式指標指向類似於void *pf(void)的函式 //leo
虛函式(繼承,多型中的理解,vptr和vtbl)
繼承和虛函式 物件模型 關於vptr和vtbl 侯捷大神的課程 講的巨tm好!有一定難度,但是很精彩,c 學習的小夥伴一定要看!我們知道,如果子類繼承了父類,那麼子類是能夠繼承父類的所有資料的 如果繼承限制允許 繼承中使用虛函式 不是虛函式 這樣的函式在父類中已經設計好,而且是不想要子類繼承的 不純...
vtbl(虛函式表)與vptr(虛函式表指標)
類的虛函式表是一塊連續的記憶體,每個記憶體單元中記錄乙個jmp指令的位址 注意的是,編譯器會為每個有虛函式的類建立乙個虛函式表,該虛函式表將被該類的所有物件共享。類的每個虛成員佔據虛函式表中的一行。如果類中有n個虛函式,那麼其虛函式表將有n 4位元組的大小。虛函式 virtual function ...
多型性 vptr和vtable
多型性 polymorphi 是物件導向程式設計的基本特徵之一。而在c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base typedef void fun 它與base中的三個虛函式相似,...