首页
社区
课程
招聘
[原创]从反汇编的角度学C/C++之虚继承
发表于: 2021-10-4 11:05 6514

[原创]从反汇编的角度学C/C++之虚继承

2021-10-4 11:05
6514

    先修改定义如下,看不是虚继承的情况下的内存情况

    先看sub构造函数

    可以看到这里和多继承时候的调用是一样的,只是由于成员变量变多偏移不同罢了,在看看Base1和Base2的构造函数

    接下来看看Base的构造函数

    可以看到不是虚继承的情况下,程序会分别调用两个父类的构造函数,由于两个父类又同时有父类,它们都会在内存中留空间给父类成员也就是x赋值。所以数据的排布以及在内存中的情况会如下图所示

               

    可以看到在没有使用虚继承的情况下程序会生成两份Base类的数据成员。接下来看看虚函数表的情况,根据上面的方法重命名以后结果如下

 

    其中的sub_40137E函数情况如下

    由此可以看出虚函数表内容和前面的多继承是一样的。接下来看看虚继承的情况,修改定义如下

    首先看看转换成虚继承以后,对构造函数的调用有什么改变

    可以看到,此时在调用构造函数的时候,除了会给ecx赋值为类变量的地址以外,还会压入一个参数,值为1。这里需要补充一点的是,在虚继承中,编译器会产生一个叫虚基类偏移表的东西。简单来说,上面的Base1和Base2都会产生,这张表偏移为4的地方存储的是类的变量在内存中的地址和虚基类,也就是Base的类变量的地址的偏移。

    接下来首先看看Sub构造函数的内容

    上面的虚偏移表内容如下

    

    接下来继续看Base的构造函数


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-10-20 11:23 被1900编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//