本文主要给大家介绍了关于如何获取c++类成员虚函数地址的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍:
GCC平台获取c++成员虚函数地址可使用如下方法[1]:
阶级基础{ int我; 公众: 虚拟空间f1 () { cout<& lt;“基本的f1 ()”& lt; & lt; endl; } }; 基地b; 空白(基地::* mfp)()=,基地:f1; printf("地址:% p " (void *) (b→* mfp));
上面的代码在Linux g++ (GCC) 4.8.5中编译通过。
可以采用内联汇编的方式获取[2],代码如下:
#定义ShowFuncAddress _asm{\(函数) }\ mov eax,函数 _asm {mov p, eax} \ cout<& lt;“地址”#功能”:“& lt; & lt;术中;& lt; endl;//使用示例 ShowFuncAddress(基地:f1);
上面的代码在VS2015中编译通过。
下面的代码可以在GCC和Visual c++共同编译运行。
/* * * * * * * * * * * * * * * * * * * * * * @className:类名称 @pObj:类对象地址 @index:虚函数表项(从0开始) * * * * * * * * * * * * * * * * * * * * * */空白showVtableContent (char * className, void * pObj, int指数){ 无符号长* pAddr=零; pAddr=reinterpret_cast<无符号长*祝辞(pObj); pAddr=(无符号长*)* pAddr;//获取虚函数表指针 cout<& lt; className<& lt;“‘s vtable [" & lt; & lt; index<& lt;“]”; cout<& lt;”:0 x”& lt; & lt; (void *) pAddr(指数)& lt; & lt; endl; }//使用示例: 阶级基础{ int我; 公众: 虚拟空间f1 () { cout<& lt;“基本的f1 ()”& lt; & lt; endl; } 虚拟空间f2 () { cout<& lt;“基本的f2 ()”& lt; & lt; endl; } }; 基地b; showVtableContent(“基地”,和b, 0);//输出第一个虚函数基础::f1的地址 showVtableContent(“基地”,和b, 1);//输出第二个虚函数基础::f2的地址
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
<强>参考文献强>
[1]打印地址的虚拟成员函数
[2]动态联编实现原理分析