获取C++类成员虚函数地址
来源:互联网 发布:电吉他 知乎 编辑:程序博客网 时间:2024/06/05 10:45
1.GCC平台
GCC平台获取C++成员虚函数地址可使用如下方法
class Base{ int i;public: virtual void f1(){ cout<<"Base's f1()"<<endl; }};Base b;void (Base::*mfp)() = &Base::f1;printf("address: %p", (void*)(b->*mfp));
上面的代码在Linux g++ (GCC) 4.8.5中编译通过。
2.Visual C++平台
可以采用内联汇编的方式获取
#define ShowFuncAddress(function) _asm{\ mov eax, function}\ _asm{mov p,eax}\ cout<<"Address of "#function": "<<p<<endl;//使用示例ShowFuncAddress(Base::f1);
上面的代码在VS2015中编译通过。
3.通过访问虚函数表获取虚函数地址
下面的代码可以在GCC和Visual C++共同编译运行。
/**********************@className:类名称@pObj:类对象地址@index:虚函数表项(从0开始)**********************/void showVtableContent(char* className, void* pObj, int index){ unsigned long* pAddr=NULL; pAddr=reinterpret_cast<unsigned long*>(pObj); pAddr=(unsigned long*)*pAddr; //获取虚函数表指针 cout<<className<<"'s vtable["<<index<<"]"; cout<<": 0x"<<(void*)pAddr[index]<<endl;}//使用示例:class Base{ int i;public: virtual void f1(){ cout<<"Base's f1()"<<endl; } virtual void f2(){ cout<<"Base's f2()"<<endl; }};Base b;showVtableContent("Base",&b,0); //输出第一个虚函数Base::f1的地址showVtableContent("Base",&b,1); //输出第二个虚函数Base::f2的地址
参考文献
[1]print address of virtual member function
[2]动态联编实现原理分析
1 0
- 【C/C++】类成员函数地址的获取及使用方法
- 获取C++类成员虚函数地址
- 获取成员方法的地址,将C++类成员方法转换成C自由函数
- 用联合体获取类成员函数地址
- 获取成员函数地址及获取函数地址
- 获取成员函数地址及获取函数地址
- 获取成员函数地址及获取函数地址
- 获取成员函数地址及获取函数地址
- C++ 获取类成员函数地址方法 浅析
- 获取类成员函数地址和调用的方法
- 获取成员函数地址的方法
- 获取成员函数地址3种方法
- 类成员函数的地址
- 类成员函数的地址
- C函数获取IP地址
- 获得类中成员地址,函数地址
- 获取类成员方法的地址
- 直接获取类中(非static)成员函数地址的方法
- 搬家
- 基于LBS的地理位置附近的搜索以及由近及远的排序(MYSQL)
- 1. 阅读spark源码之前的一些准备
- CSS3.flexbox布局-父级容器属性
- iOS 内存优化 代理--weak
- 获取C++类成员虚函数地址
- 面向对象设计方法理解
- 欢迎使用CSDN-markdown编辑器
- T-SQL 之局部变量(1)
- Tomcat闪退
- 理解.NET中的CLR原理
- Java面试题集
- Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置
- go使用pprof做性能分析