C++中的虚函数
来源:互联网 发布:windows10安装不了软件 编辑:程序博客网 时间:2024/05/29 10:42
虚函数的实现
简单的讲,当定义一个虚函数后,类里面会有一个__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);}
- [C++]C++中的虚函数
- c中的函数指针
- C ++ 中的函数
- C中的随机数函数
- c中的strtok函数
- c语言中的函数
- C中的static函数
- unix中的c函数
- C中的stat()函数
- C中的strncat()函数
- C中的qsort函数
- c中的字符串函数
- C中的access函数
- C语言中的函数
- C中的access函数
- C中的access函数
- C中的access函数
- C中的qsort函数
- js五种继承方式(在别的博客上面看的,然后自己稍微整理一下)
- Android的SDK与ADT不匹配问题
- Android Build获得系统信息
- ARM MP-core启动流程
- 图片压缩上传
- C++中的虚函数
- [转] 关于W5100+SD的冲突及解决
- SQLITE入门至精通
- Schrodinger 功能模块简介
- HBase源代码调试(6)-HRegion的启动
- Hive 随谈(四)– Hive QL
- 如何在12306上买卧铺自己选席位
- p2p技术分类与发展方向
- 如何在Ubuntu中利用Qemu运行BeagleBoard firmware