虚函数表地址问题
类继承如下
#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;
// pFun=(Fun)*((int*)*(int*)&d);
// cout<<((int*)*(int*)&d)<<endl;
// cout<<((int*)*((int*)&d+1))<<endl;
pFun=(Fun)pVtab[0][1];
pFun();
pFun=(Fun)pVtab[1][1];
pFun();
return 0;
}
主函数中
int ** pVtab=(int**)&d;
pFun=(Fun)pVtab[0][1];
pFun();
pFun=(Fun)pVtab[1][1];
pFun();
就分别调用了Base1::g(),Base2::g()
不明白int ** pVtab=(int**)&d;语句的含义,(int**)&d将d对象地址转换成什么类型的指针,
pVtab[0][1],pVtab[1][1]是数组形式,为什么可以这样访问虚函数
难道系统会把3个基类的虚函数表组织成1个2维数组,在内存中是连续的?