如何获取虚函数表指针?虚函数表地址?虚函数地址?

2023-10-28

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;


class A    //定义一个类A,类中有3个虚函数
{
public:
	int x;
	int y;
	virtual void f(){ cout << "f() called !" << endl; };
	virtual void f1(){ cout << "f1() called !" << endl; };
	virtual void f2(){ cout << "f2() called !" << endl; };
};


int main()
{
    A a;
	cout << hex ;
	cout << "类的首地址:" << &a << endl;
	
	//对于类的每个对象,编译器都会为其生成一个虚函数表指针,位于该对象内存中的开头,并指向了虚函数表的位置。
	//&a得到对象a的首地址,强制转换为(int *),意为将从&a开始的4个字节看作一个整体,而&a就是这个4字节整体的首地址,也就是虚表指针。
	cout << "虚函数表指针: " << (int *)(&a) << endl;
	
	//虚函数表指针只想虚函数表,所以解引用就是虚函数表的地址
    cout << "虚函数表地址: " << *(int *)(&a) << endl;  
    
    
    /*
        下面获取虚函数地址(通过增加偏移量)
        两种做法:(首先获取虚函数表地址addr)
            1. 在虚函数表地址上 加字节偏移4*x(x从0开始),然后转换成指针,然后获取:
                *(int *)(addr + 4*x);
                
            2. 虚函数表地址 转换成指针,然后通过增加指针的偏移量x(x从0开始) 获取:
                *((int *)addr + x);
    */
 
    int addr = *(int *)(&a);    //虚函数表地址
 
    //f()地址
    int f_addr_1 = *(int *)(addr + 0);  //第1种
 	int f_addr_2 = *((int *)addr + 0);  //第2种
 	cout<<"f()的地址:"<<f_addr_1<<' '<<f_addr_2<<'\n';

 	//f1()地址
    int f1_addr_1 = *(int *)(addr + 4); //第1种
 	int f1_addr_2 = *((int *)addr + 1); //第2种 
    cout<<"f1()的地址:"<<f1_addr_1<<' '<<f1_addr_2<<'\n';
 	
	//f2()地址
    int f2_addr_1 = *(int *)(addr + 8); //第1种
 	int f2_addr_2 = *((int *)addr + 2); //第2种
    cout<<"f2()的地址:"<<f2_addr_1<<' '<<f2_addr_2<<'\n';

    return 0;    
}

感谢,参考与:这篇文章

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

如何获取虚函数表指针?虚函数表地址?虚函数地址? 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问

随机推荐

  • 新版Spring Boot(11)- Spring Boot 整合NoSQL(1)

    1 整合redis 单测 package com tzb cachespringboot import com tzb cachespringboot model User import org junit jupiter api Test
  • C++ 引用 解引用 取地址 指针 双指针 指针的引用 二级指针

    为了把引用 解引用 取地址 指针 双指针 指针的引用 二级指针 这一块弄清楚 钻研与查阅资料得到如下体会 1 引用与取地址 reference and address 引用的 前面一定有类型符号 否则就不是引用 取地址的 后面一定有变量名称
  • 景联文数据标注:AI大模型在教育和医疗领域的应用

    8月31日消息 备受行业瞩目的首批大模型产品获批名单发布 首批通过备案的8家大模型公司分别是 百度 文心一言 抖音 云雀大模型 智谱AI GLM大模型 中科院 紫东太初大模型 百川智能 百川大模型 商汤 日日新大模型 MiniMax ABA
  • 下载Git速度太慢的解决方法【记录】

    直接传送门 点击此链接即可进入git的下载仓库 https registry npmmirror com binary html path git for windows 如下图所示 点击选择你需要的版本进去下载就行了 这里记录一下 备忘
  • Qt 常用类 (4)—— QPoint

    QPoint 类代表一个坐标点 实现在 QtCore 共享库中 它可以认为是一个整型的横坐标和一个整型的纵坐标的组合 构造 QPoint 类支持以下两种构造方式 plain view plaincopy QPoint 构造横纵坐标均为 0
  • 静态链表的基本操作

    定义 用数组描述的链表叫做静态链表 这种描述方法还有起名叫做游标实现法 基本操作 Status InitList StaticLinkList space 将一维数组space中各分量链成一个备用链表 int Malloc SLL Stat
  • 以太坊区块与区块头数据结构解析

    Block数据结构解析 源代码 Block represents an entire block in the Ethereum blockchain type Block struct header Header uncles Heade
  • IBM MQ命令:DEFINE AUTHINFO

    此命令里有很多内容值得一看 https www ibm com docs en ibm mq 8 0 topic commands define authinfo q085490 6 一 CHCKCLNT CHCKCLNT This att
  • Git使用详解(结合GitLab和GitHub)

    转载请注明出处 https blog csdn net mythmayor article details 82346539 如果你想了解更多关于GitHub使用的问题 欢迎查看我的另一篇博客进行学习与交流 GitHub的使用详解 一 Gi
  • VC++读目录下所有文件

    include
  • ChatGPT训练营来啦,手把手带你玩转ChatGPT~

    ChatGPT的出现为测试行业带来了新的机遇和挑战 尽管许多人担心它的强大可能会取代测试人员 但实际上ChatGPT可以成为测试人员的强大助手 提高测试工作的效率和准确性 那么 我们应该如何借助 ChatGPT 让我们的测试工作更高效呢 C
  • Lua 随机数生成问题

    原文链接 http blog csdn net zhangxaochen article details 8095007 Lua 生成随机数需要用到两个函数 math randomseed xx math random n m 1 math
  • Win10开启热点共享后断网怎么解决?

    描述 关闭热点一切正常 打开热点以后电脑浏览器无法联网 最后发现可能是windows更新导致的 卸载了2022 06 17的更新就好了 因为没有去看dism 是什么东西 怕有木马啥的 就选择方法二卸载了2022 06 17的更新就好了 参考
  • QCustomPlot 使用——绘制折线图

    初始化数据 QVector
  • 检测模型设计准则

    作者 小书童 编辑 集智书童 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 目标检测 技术交流群 后台回复 2D检测综述 获取鱼眼检测 实时检测 通用2D检测等近5年内所有综述 设计高效 高质
  • 电路板布局

    一 PCB布局要求 1 可制造性设计 DFM 可装配性 DFA 可维修性 DFS 可测试性 DFT 2 电气性能实现 ccc fcc ce认证 EMC SI PI及散热要求 3 合理的成本 层数也多成本越高 4 美观度 二 布局的一般原则
  • uni封装ajax,uni-app封装ajax请求方法

    位置项目根目录index js 定义了两种请求get和post import baseconfig from common baseconfig js const httpClient request function method url
  • 求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows

    求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows 大家好我是艾西 最近研究了下 l4d2 求生之路2 这款游戏的搭建以及架设过程 今天就给喜欢l4d2这款游戏的小伙伴们分享下怎么搭建架设一个自己的服务器 毕竟自己当服主是热
  • C语言指针学习 课堂记录

    定义指针变量 类型名 指针变量名 pa和pb是自定义名 char pa 定义一个指向字符型的指针变量 int pb 定义一个指向整型的指针变量 取地址运算符和取值运算符 一 如果需要获取某个变量的内存地址 可以使用取地址运算符 char p
  • 如何获取虚函数表指针?虚函数表地址?虚函数地址?

    include