虚函数表3

#include <iostream>
  
 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;
  
  
             cout<<sizeof(d)<<endl;
 
             return 0;
  
 }

多重继承下的虚函数表例子

原文地址:https://www.cnblogs.com/zzj2/p/3013340.html