C++从虚表地址中取内容

Posted 巡安似海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++从虚表地址中取内容相关的知识,希望对你有一定的参考价值。

开局一张图

从地址中,调用虚表中的函数,上图!

C++从虚表地址中取内容_C++

1、定义父类指针地址,申请子类内存空间

cParent *cp = new cSon;


2、获取虚表的首地址

cp          指针变量

int*        强转为int类型

* 再取*,表示取虚表的首地址

为什么​​*​​是取虚表呢,因为cp指针变量本身就是父类地址申请的子类空间,就是虚析构

*(int*)cp


3、虚表首地址取到了,接下来该取虚表中的第一个元素首地址

将虚表首地址强转为int类型,加0,然后取​​*​​,即可取到第一个元素首地址

*((int*)*(int*)cp + 0);

取第二个元素首地址呢?加1,取​​*​​即可

*((int*)*(int*)cp + 1);

(虚表首地址强转为int后,加几并取​​*​​表示取虚表中第几个函数地址)


4、函数地址调用

每个元素的首地址都有了,接下来定义一个void 函数指针来调用元素地址

typedef void (*p)();

((p)(*((int*)*(int*)cp + 0)))(); // 加() 表示调用,不加表示引用,肯定要加的

注意编译环境是x86

C++从虚表地址中取内容_父类_02


最后

文章短小,但是实用!希望帮助正在学习C++的你。

以上是关于C++从虚表地址中取内容的主要内容,如果未能解决你的问题,请参考以下文章

C++多态

C++多态(下)

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

C++虚函数表小记

在类有成员变量的场景下, 按照虚表原理, 模拟虚函数实现

C语言中取地址跟C++中的引用是一个意思吗?