开局一张图
从地址中,调用虚表中的函数,上图!
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++的你。