虚函数的实现
简单的讲,当定义一个虚函数后,类里面会有一个__vptr指针,指向vtbl(虚函数表),虚函数表里面存放了其对应的虚函数的地址
如上例,没有其它数据成员的情况下
//把vptr的值放到lVptrAddr,这个值也就是vtbl的地址
long lVptrAddr;
memcpy(&lVptrAddr , p , 4);
//然后根据vtbl得到相应的虚函数地址
void (*fun)(A*);//函数指针,这里参数为类指针,调用类成员函数是,会有一个this指针,这里的A*就是那个this指针
memcpy(&fun,(long*)lVptrAddr,4);
简单的讲,当定义一个虚函数后,类里面会有一个__vptr指针,指向vtbl(虚函数表),虚函数表里面存放了其对应的虚函数的地址
所有当没有其它数据成员时,用sizeof取其大小,其大小为4
class A
{
public:
virtual void Fun(){
printf("A::Fun()\n");
};
virtual void Fun2()
{
printf("A::Fun2()\n");
}
};
class B:public A
{
public:
void Fun(){
printf("B::Fun()\n");
}
void Fun2(){
printf("B::Fun2()\n");
}
};
如果想手动调用虚函数,可以这样做,先得到vptr,跟据vptr找到vtbl...
如上例,没有其它数据成员的情况下
//把vptr的值放到lVptrAddr,这个值也就是vtbl的地址
long lVptrAddr;
memcpy(&lVptrAddr , p , 4);
//然后根据vtbl得到相应的虚函数地址
void (*fun)(A*);//函数指针,这里参数为类指针,调用类成员函数是,会有一个this指针,这里的A*就是那个this指针
memcpy(&fun,(long*)lVptrAddr,4);
int main()
{
A a;
B b;
A *p = &b;
long lVptrAddr;
memcpy(&lVptrAddr , p , 4);
void (*fun)(A*);
memcpy(&fun,(long*)lVptrAddr,4);
fun(p);
return 0;
}
//更通用的代码
void CallVirtualFun(void *pThis,int index = 0)
{
void (*funptr)(void *);
long lVptrAddr = 0;
memcpy(&lVptrAddr , pThis , 4);
memcpy(&funptr,((long*)lVptrAddr) + index , 4);
funptr(pThis);
}