1.GNU C++平台

GNU C++ 平台获取 C++ 成员虚函数地址可使用如下方法[1]^{[1]}[1]:

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));

上面的代码通过GCC 4.8.5中编译通过。

2.Visual C++ 平台

可以采用内联汇编的方式获取[2]^{[2]}[2],代码如下:

#define ShowFuncAddress(function) _asm{\mov eax, function}\_asm{mov p,eax}\cout<<"Address of "#function": "<<p<<endl;//使用示例
ShowFuncAddress(Base::f1);

上面的代码在VS2017中编译通过。

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<<"]: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;}
};int main()
{Base b;showVtableContent("Base",&b,0);  //输出第一个虚函数Base::f1的地址showVtableContent("Base",&b,1);  //输出第二个虚函数Base::f2的地址
}

程序运行结果:

Base's vtable[0]:0x00C81505
Base's vtable[1]:0x00C811DB

参考文献

[1] print address of virtual member function
[2] C++动态联编实现原理分析

C++ 获取类成员虚函数地址相关推荐

  1. C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中

    C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...

  2. c++中的虚特性(虚基类、虚函数、纯虚函数)

    1. 虚基类 1.1 虚基类作用 为了解决多继承时的命名冲突和冗余数据问题,使得派生类中只保留一份间接基类的成员. 其本质是是让某个类做出声明,承诺愿意共享它的基类.其中,这个被共享的基类就称为虚基类 ...

  3. C++模板类的虚函数成员

    C++模板类只有在被使用的时候才会被特化,同样其成员函数也是在被使用的时候才被实例化.但是虚函数成员例外,原因应该是在定义一个模板类类型的变量时(使用模板类),为了确定虚函数表的大小,就已经实例化了虚 ...

  4. c++虚函数地址的获取

    最近在做的一个项目的一个步骤找到虚函数的实际地址.这个过程中遇到的问题,让我感觉到了自己对于C++指针的理解还是不够透彻,记录一下. 概念 指针由两个空间组成 一是指针本身占有一定的空间,32位操作系 ...

  5. C++虚表地址和虚函数地址

    C++虚表地址和虚函数地址 虚函数是c++实现多态性的一个重要知识点,本文主要解析虚函数在内存中的地址,以及与虚表地址的关系. 声明一个类,包含两个虚函数,一个普通成员函数和一个类成员. 调试程序,查 ...

  6. C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址

    C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当 ...

  7. 【虚基类、虚函数及应用】

    虚基类 1.虚基类存在的意义 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类 ...

  8. cnbloger: 北岛知寒, C++ - 虚基类、虚函数与纯虚函数; csdner: Hsuxu, C++虚基类的实现机制

    If the author of the article is not allowed to reprint, this article will be deleted C++ - 虚基类.虚函数与纯 ...

  9. 虚基类、虚函数和纯虚基类

    http://blog.csdn.net/lovemysea/article/details/5298589 首先看一个例子: class Base { public:     virtual voi ...

最新文章

  1. iOS开发UI篇—transframe属性(形变)
  2. Oracle 11g Release 1 (11.1) Data Pump 导入模式
  3. 设置Flex toolTip的样式
  4. armv8/armv7中SCTLR的区别
  5. 动态开辟指定数量的线程来查找动态开辟的数组中的1000000数据中的值
  6. php事件编程,PHP相应button中onclick事件的案例分析
  7. AQS功能及源码详解
  8. 计算机网络的概念,功能和分类
  9. 计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
  10. ArcGIS修改矢量边界(土地利用图图斑)
  11. tensorflow中的py_function与watch
  12. 虚拟机vmware与本地磁盘共享方法
  13. mitmproxy抓https出现502Bad Gateway. unable to get local issuer certificate的解决方法
  14. 红帽linux卸载软件命令,好记性不如烂笔头- linux 下rpm软件的安装和卸载 rpm --force -ivh ......
  15. oppo小布机器人_OPPO小布助手建立GUI+VUI协作机制,创新快应用融合能力
  16. 典型的计算机网络安全技术有哪些,网络安全(计算机网络安全技术有哪些)
  17. Linux 命令 poll 和 ppoll 详解 + 实例
  18. 营销组合--4P理论vs4CS
  19. WindowsTool
  20. Python tkinter 学习笔记(2)-- 控件、组件(二)

热门文章

  1. 使用递归方法 删除文件夹及文件夹内文件
  2. SQL Server打开数据表中的XML内容时报错的解决办法
  3. 虚拟机危险!一个存在11年的缓冲区溢出漏洞--毒液
  4. 这种div高度自适应确定你知道吗?
  5. 第十章——维护索引(1)——索引碎片
  6. 学习方法:提出和解决问题
  7. Stimulsoft Reports ASP.NET HTML5报表设计器
  8. 在Mac系统下架设WiFi热点,对比Win7
  9. Linux服务器上无法保存修改的文件
  10. 本地socket通讯 -转