C++中的虚函数

来源:互联网 发布:windows10安装不了软件 编辑:程序博客网 时间:2024/05/29 10:42
虚函数的实现
简单的讲,当定义一个虚函数后,类里面会有一个__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);}



原创粉丝点击