获取C++类成员虚函数地址

1.GCC平台

GCC平台获取C++成员虚函数地址可使用如下方法[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));

上面的代码在Linux g++ (GCC) 4.8.5中编译通过。

2.Visual C++平台

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

#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]动态联编实现原理分析

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java基础知识详细总结

ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类...

1303
来自专栏Java成神之路

Spring_总结_03_装配Bean(三)之XML配置

用来装配bean的最基本的XML元素包含在spring-beans模式中,在上面这个XML文件中,它被定义为根命名空间。

603
来自专栏积累沉淀

Linux之grep和egrep命令总结

grep / egrep 语法: grep  [-cinvABC]  'word'  filename -c :打印符合要求的行数 -i :忽略大小写 ...

18810
来自专栏ppjun专栏

Android十八章:从Android看Binder

Binder是android上的一个类 继承了IBinder,用作Ipc进程间通讯,同是帮助Serivermanager连接各种manager(activity...

582
来自专栏desperate633

Java动态代理与静态代理静态代理动态代理

我们先看一个简单的例子,当我们需要程序中加入方法执行的日志信息的时候,很显然我们最容易想到的实现方法,就是在方法前后插入日志记录信息。

1512
来自专栏漏斗社区

Java代码审计| Spring框架知识篇

在上期的Java代码审计Spring框架思路篇中,斗哥为大家讲述了如何得到Spring审计的Demo,审计源码,根据Spring框架审计思路初步判定是否存在漏洞...

962
来自专栏转载gongluck的CSDN博客

google protobuf学习笔记:编译安装、序列化、反序列化

简介 protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实...

1.5K5
来自专栏爱撒谎的男孩

Struts2之获取请求参数

3466
来自专栏小樱的经验随笔

C/C++中int128的那点事

最近群友对int128这个东西讨论的热火朝天的。讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev...

3001
来自专栏康怀帅的专栏

Bash 条件判断与流程控制相关语句详解

介绍 if case 等语句。 条件判断语句 字符串判断 str1 = str2    当两个字符串有相同内容、长度时为真 str1 != str2   当字符...

2614

扫码关注云+社区

领取腾讯云代金券