#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 | |-------------------| |-------------------| |-------------------| |-------------------|

C++ 虚函数表详解:多重继承下的虚函数表布局

原文地址: https://www.cveoy.top/t/topic/nOyg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录