如何获取c++类成员虚函数地址的示例代码

  

本文主要给大家介绍了关于如何获取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]动态联编实现原理分析

如何获取c++类成员虚函数地址的示例代码