C++虚函数表地址偏移

2023-11-14

#include <bits/stdc++.h>
using namespace std;

class Base {
public:
	Base() {
		cout << "Base构造" << endl;
	}
	virtual ~Base() {
		cout << "Base虚析构" << endl;
	}
	virtual void f1() {
		cout << "Base::f1()" << endl;
	}
	void f2() {
		cout << "Base::f2()" << endl;
	}
	virtual void f3() {
		cout << "Base::f3()" << endl;
		//cout << data << endl;	
	}
	int data = 5;
	static void fn() {
	}
};

int main() {
	cout << sizeof(Base) << endl;

	Base* p1 = new Base();
	Base* p2 = new Base();
	cout << p1->fn << endl;		// 静态成员函数可以直接获取地址
	cout << Base::fn << endl;	// 静态成员函数可以直接获取地址

//	cout << &Base::f1 << endl;	// 编译器将void(__thiscall A::*)()类型转换为bool类型
	printf("Base::f1()地址:%p\n", &Base::f1);
	printf("Base::f1()地址:%p\n", &Base::f1);
	printf("Base::f2()地址:%p\n", &Base::f2);
	printf("Base::fn()地址:%p\n", &Base::fn);

	cout << "p1对象地址: " << (p1) << endl;
	cout << "p1虚函数表首地址: " << (int*)(p1) << endl;
	cout << "p1虚函数表中第1个虚函数地址: " << (int*)*(int*)(p1) << endl;
	cout << "p1虚函数表中第2个虚函数地址: " << ((int*)*(int*)(p1)+1) << endl;
	cout << "p1虚函数表中第3个虚函数地址: " << ((int*)*(int*)(p1)+2) << endl;
	cout << "p1虚函数表中第4个虚函数地址: " << ((int*)*(int*)(p1)+3) << endl;


	cout << "p2对象地址: " << (p2) << endl;
	cout << "p2虚函数表首地址: " << (int*)(p2) << endl;
	cout << "p2虚函数表中第1个虚函数地址: " << (int*)*(int*)(p2) << endl;
	cout << "p2虚函数表中第2个虚函数地址: " << ((int*)*(int*)(p2)+1) << endl;
	cout << "p2虚函数表中第3个虚函数地址: " << ((int*)*(int*)(p2)+2) << endl;
	cout << "p2虚函数表中第4个虚函数地址: " << ((int*)*(int*)(p2)+3) << endl;

	cout << endl;

	typedef void(*PFUN)();

	PFUN pfBase = (PFUN) * ((int*)*(int*)p1 + 0);	// 析构
	PFUN pf1 = (PFUN) * ((int*)*(int*)p1 + 1);	// f1
	PFUN pf2 = (PFUN) * ((int*)*(int*)p1 + 2);	// f2
	PFUN pfnull = (PFUN) * ((int*)*(int*)p1 + 3);	//0x00
	pf1();
	pf2();	// 如果函数中有类成员变量,这样调用会出错。普通变量不会。和this指针有关。

}

C/C++获取函数地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++虚函数表地址偏移 的相关文章

随机推荐

  • Unity Shader渲染顺序 坐标系 和光照模型

    1 Shader中的渲染顺序 是按照Queue Geometry RenderType Opaque Queue是一般渲染时候的顺序 RenderType是后处理特效使用的渲染顺序 Background Geometry AlphaTest
  • JAVA中XML格式字符串转为javabean(对象),然后返回xml格式字符串

    一 引入相关依赖 pom xml文件配置如下所示
  • Road Construction POJ - 3352(tarjan双连通缩点模板)

    题目描述 给一个无向连通图 至少添加几条边使得去掉图中任意一条边不改变图的连通性 即使得它变为边双连通图 include
  • CH3___Debugging C++ Programs

    3 1 Syntax and semantic errors Modern compilers have been getting better at detecting certain types of common semantic e
  • Linux下yum命令及软件的安装

    yum命令 1 yum install softwarename 安装 2 yum remove softwarename 卸载 安装dhcp及卸载 mkdir iso 建立目录 mv home kiosk Desktop iso iso
  • tcp 是一个安全的网络协议

    1 tcp 是一个安全的网络协议 确定双方的收发能力之后 才会真正传输数据 2 tcp 建立起一个连接 比较消耗成本 所以比较平稳 安全 3 3次握手 发起连接 双方确认 确认双方的收发能力 客户端告诉服务器i我要创建连接i 一次 服务器告
  • 出栈的合法性检测

    对于一个给定的入栈顺序 可能的出栈顺序会有很多 但是肯定都要遵循栈 后进先出 的特点 那么怎么进行合法性检测呢 算法思想如下 定义变量InIndex标记入栈序列的当前位置 定义OutIndex标记出栈序列的当前位置 对InIndex和Out
  • 利用纯净语音和噪声合成不同信噪比的训练数据

    如题 这应该算是我前往语音这座大山的第一步 在此做出记录 一 工作背景 由于需要进行单通道降噪的实验 但是现在只有纯净语音和噪声数据 而在阅读文章的过程中 大家并没有将这个细小的内容写道论文中 的确也不应该 做出来之后确实感觉蛮简单的 所以
  • python爬虫ip被封怎么办?

    用python写的爬虫 设置了headers 包括host和useragent 设置了cookies 访问的结果是 访问过于频繁 请输入验证码 但是用浏览器访问怎么刷新都没有问题 这个时候大致可以判定你被反爬虫锁定 那怎样解决 你可能不太了
  • Python无法识别csv文件

    我的报错 utf 8 codec can t decode byte 0xc9 in position 84 invalid continuation byte 大概意思是utf 8无法识别文件里的一些信息 后面将encoding里面改成下
  • 【Java编程】图书管理系统

    图书管理系统 我们用一个列表存放书籍信息 private static List
  • paxos算法_共识算法(8) —— PBFT 算法详解

    本文翻译自 伊利诺伊大学厄巴纳 香槟分校助理教授 Ling Ren 开设的讨论课 CS598 Consensus Algorithm 参考论文 PBFT 原论文 1999 pmg csail mit edu 前言 上一节中我们介绍了经典的P
  • IDEA项目初次上传到git(超简单)

    IDEA上传到git 1 右键项目 打开 终端 2 在打开的终端输入 git init 3 右键项目 选择 git gt 添加 add 4 右键项目 选择 git gt 提交 commit 输入 init 点击 提交并推送 commit a
  • Ehoney开源欺骗防御系统

    一 特点 支持丰富的蜜罐类型 通用蜜罐 SSH 蜜罐 Http蜜罐 Redis蜜罐 Telnet蜜罐 Mysql蜜罐 RDP 蜜罐 IOT蜜罐 RTSP 蜜罐 工控蜜罐 ModBus 蜜罐 基于云原生技术 基于k3s打造saas平台欺骗防御
  • 创建一们计算机语言_建立自己的计算机语言

    创建一们计算机语言 只需编码 如果您想构建自己的计算机语言 但又不知道该如何开始 或者您认为自己没有时间和技能来做到这一点 那么请看鲍勃 尼斯特罗姆 Bob Nystrom 的 技巧翻译 一书 即从刮 从一开始到成熟的面向对象的东西就是这样
  • JDBC工具类——JdbcUtils

    JdbcUtils 一 JDBC的工具类 二 JdbcUtils工具类的组成 1 类加载时加载驱动 2 连接池 db properties 3 ThreadLocal控制事务 4 dbcp连接池提高资源利用率 三 JDBC工具类的实例演变
  • Ubuntu opencv的搭建

    打开终端 apt install cmake 依次输入以下的命令 sudo apt get install cmake git libgtk2 0 dev pkg config libavcodec dev libavformat dev
  • Linux字符集的查看及修改

    一 查看字符集 字符集在系统中体现形式是一个环境变量 以CentOS6 5为例 其查看当前终端使用字符集的方式可以有以下几种方式 第一种 root Testa www tmp echo LANG zh CN UTF 8 第二种 root T
  • Nvidia显卡硬件编解码能力表 官方链接

    记录用 便于快速查找 从表中得知 1070支持 H265 10bit 硬件编码 似乎不错 官方链接 https developer nvidia com video encode and decode gpu support matrix
  • C++虚函数表地址偏移

    include