C++ 虚函数表详解:多重继承下的虚函数表布局
#include
using namespace std;
class Base1 {
public:
virtual void f() { cout << 'Base1::f' << endl; }
virtual void g() { cout << 'Base1::g' << endl; }
virtual void h() { cout << 'Base1::h' << endl; }
};
class Base2 {
public:
virtual void f() { cout << 'Base2::f' << endl; }
virtual void g() { cout << 'Base2::g' << endl; }
virtual void h() { cout << 'Base2::h' << endl; }
};
class Base3 {
public:
virtual void f() { cout << 'Base3::f' << endl; }
virtual void g() { cout << 'Base3::g' << endl; }
virtual void h() { cout << 'Base3::h' << endl; }
};
class Derive : public Base1, public Base2, public Base3 {
public:
virtual void f() { cout << 'Derive::f' << endl; }
virtual void g1() { cout << 'Derive::g1' << endl; }
};
typedef void(*Fun)(void);
int main()
{
Fun pFun = NULL;
Derive d;
int** pVtab = (int**)&d;
//Base1's vtable
//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+0);
pFun = (Fun)pVtab[0][0];
pFun();
//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+1);
pFun = (Fun)pVtab[0][1];
pFun();
//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+2);
pFun = (Fun)pVtab[0][2];
pFun();
//Derive's vtable
//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+3);
pFun = (Fun)pVtab[0][3];
pFun();
//The tail of the vtable
pFun = (Fun)pVtab[0][4];
cout<<pFun<<endl;
//Base2's vtable
//pFun = (Fun)*((int*)*(int*)((int*)&d+1)+0);
pFun = (Fun)pVtab[1][0];
pFun();
//pFun = (Fun)*((int*)*(int*)((int*)&d+1)+1);
pFun = (Fun)pVtab[1][1];
pFun();
pFun = (Fun)pVtab[1][2];
pFun();
//The tail of the vtable
pFun = (Fun)pVtab[1][3];
cout<<pFun<<endl;
//Base3's vtable
//pFun = (Fun)*((int*)*(int*)((int*)&d+1)+0);
pFun = (Fun)pVtab[2][0];
pFun();
//pFun = (Fun)*((int*)*(int*)((int*)&d+1)+1);
pFun = (Fun)pVtab[2][1];
pFun();
pFun = (Fun)pVtab[2][2];
pFun();
//The tail of the vtable
pFun = (Fun)pVtab[2][3];
cout<<pFun<<endl;
return 0;}
Derived类虚函数表示意图:
Derived类的虚函数表表示意图:
|-------------------| |-------------------| |-------------------| |-------------------| | Base1::f() | | Base2::f() | | Base3::f() | | Derive::f() | |-------------------| |-------------------| |-------------------| |-------------------| | Base1::g() | | Base2::g() | | Base3::g() | | 0x00000000 | |-------------------| |-------------------| |-------------------| |-------------------| | Base1::h() | | Base2::h() | | Base3::h() | | 0x00000000 | |-------------------| |-------------------| |-------------------| |-------------------| | 0x00000000 | | 0x00000000 | | 0x00000000 | | 0x00000000 | |-------------------| |-------------------| |-------------------| |-------------------|
原文地址: https://www.cveoy.top/t/topic/nOyg 著作权归作者所有。请勿转载和采集!