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

别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述C++从虚表地址中取内容相关的知识,希望能为你提供帮助。
开局一张图从地址中,调用虚表中的函数,上图!

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

cParent *cp = new cSon;


2、获取虚表的首地址
cp                  指针变量
int*              强转为int类型
* 再取*,表示取虚表的首地址
为什么??*??是取虚表呢,因为cp指针变量本身就是父类地址申请的子类空间,就是虚析构
*(int*)cp


3、虚表首地址取到了,接下来该取虚表中的第一个元素首地址
将虚表首地址强转为int类型,加0,然后取??*??,即可取到第一个元素首地址
【C++从虚表地址中取内容】*((int*)*(int*)cp + 0);
取第二个元素首地址呢?加1,取??*??即可
*((int*)*(int*)cp + 1);
(虚表首地址强转为int后,加几并取??*??表示取虚表中第几个函数地址)


4、函数地址调用
每个元素的首地址都有了,接下来定义一个void 函数指针来调用元素地址
typedef void (*p)();
((p)(*((int*)*(int*)cp + 0)))(); // 加() 表示调用,不加表示引用,肯定要加的
注意编译环境是x86


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


    推荐阅读