C++的類成員如果有Virtual修飾符,則在實例化後的對象中會形成一個叫做VTBL(虛擬表)的東西,另外借助C++內在的滯後綁定功能實現所謂的多態性。下面,我借助C代碼來大概演示下VTBL的實現原理,僅供參考。
//模擬VTBL,實際為一套函數集合
Struct SampleVtbl {
void func() {}
}
//模擬帶Virtual成員的類
Struct SampleClass {
SampleVtbl *pVtbl;
}
//分配內存空間,在尾部預留空間為VTBL使用
void init(SampleClass* pObject) {
pObject = (SampleClass *)malloc(sizeof(SampleClass) + sizeof(SampleVtbl));
pObject->pVtbl = (SampleVtbl *)(pObject + 1);
}
void TestSample()
{
SampleBase *obj;
init(obj);
(*(SampleVtbl **)obj)->func();
free(obj);
}