首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

虚函数表有关问题,求大神详细指导

2012-05-12 
虚函数表问题,求大神详细指导#include iostreamusing namespace stdclass A{virtual void g(){coutA

虚函数表问题,求大神详细指导
#include <iostream>
using namespace std;
class A{
virtual void g(){
cout<<"A::g()"<<endl;
}
private:
virtual void f(){
cout<<"A::f()"<<endl;
}
} ;
class B:public A{
void g(){
cout<<"B::g()"<<endl;
}
virtual void h(){
cout<<"B::h()"<<endl;
}
};
typedef void(*Fun)(void);//这里是函数指针吧
int main(){
B b;
Fun pFun;
for(int i = 0;i<3;i++){
pFun = (Fun)*((int*)*(int*)(&b)+i);//这里星星太多了,看的有点头晕
pFun();
}//B::g(),A::f();B::h
return 0;
}

[解决办法]
一个class只有一个virtual table,每一个class object有一个指向virtual table的vptr,所以你要想获得virtual table上的virtual function ,首先你要知道vptr,然后知道virtual table ,最后才知道virtual funcion
vptr与class object有关:vptr=*(int*)(&b);
virtual table 被vptr指着 virtual table的首地址:(int*)vptr=(int*)*(int*)(&b)
virtual function的地址:(int*)*(int*)(&b)+i
virtual function函数:*((int*)*(int*)(&b)+i)
将virtual function函数转换Fun:(Fun)*((int*)*(int*)(&b)+i)

热点排行