首页
社区
课程
招聘
未解决 [求助]析构函数当中为什么赋值虚表??
发表于: 2018-12-20 15:57 1513

未解决 [求助]析构函数当中为什么赋值虚表??

2018-12-20 15:57
1513
今天看到《加密与解密》第四版,第170页和171页的时候,发现了一个问题,就是在构造函数当中初始化虚表之后,在析构函数当中为什么又要给虚表赋值?????

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (8)
雪    币: 2473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
图太小看不清
2018-12-20 16:14
0
雪    币: 697
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
编译器为了防止你在析构函数中调用虚表中的函数, 实际上在析构函数中调用虚表中的函数时,它不会生成调用虚函数的汇编代码, 而是会生成E8call.  你可以写代码验证下。
2018-12-20 16:14
1
雪    币: 910
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
maomaolk 编译器为了防止你在析构函数中调用虚表中的函数, 实际上在析构函数中调用虚表中的函数时,它不会生成调用虚函数的汇编代码, 而是会生成E8call. 你可以写代码验证下。
没太听懂,,,那在析构函数当中赋值虚表有什么意义呢?。。。书上说的是这是因为C++语法规定,析构函数需要调用虚函数的无多态性。。。这句话我也没有理解,还望更详细的解答一下,,多谢
2018-12-20 16:49
0
雪    币: 23081
活跃值: (3447)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
5
在析构中为虚表再次赋值是因为要考虑有继承关系的析构中调用虚函数,有继承的类析构顺序是:子类析构->父类析构......因此在执行析构时需要将虚表指针指向对应的子类或父类的虚表
最后于 2018-12-20 17:11 被KevinsBobo编辑 ,原因:
2018-12-20 17:09
0
雪    币: 697
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
实际上这个问题从逆向的角度来说您也不用太纠结, 因为它就是在析构的时候又为虚表赋了一次值而已,我们多了一次找到虚表的机会。 我个人认为可能编译器觉得假如虚表指针指向别处了呢?或者是我们自己写代码将虚表的指针指向别处了呢?所以编译器在编译时又重新为它赋了一次值,可以是为了更安全的考虑吧。
2018-12-20 17:26
0
雪    币: 697
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你也可以看看KevinsBobo版主的这方面文章。
2018-12-20 17:27
0
雪    币: 910
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
KevinsBobo 在析构中为虚表再次赋值是因为要考虑有继承关系的析构中调用虚函数,有继承的类析构顺序是:子类析构->父类析构......因此在执行析构时需要将虚表指针指向对应的子类或父类的虚表
嗯嗯,我懂了,多谢
2018-12-20 17:39
0
雪    币: 910
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
maomaolk 实际上这个问题从逆向的角度来说您也不用太纠结, 因为它就是在析构的时候又为虚表赋了一次值而已,我们多了一次找到虚表的机会。 我个人认为可能编译器觉得假如虚表指针指向别处了呢?或者是我们自己写代码将虚表 ...
这个地方我明白了,多谢,因为他在调用析构函数的时候,子类析构->父类析构,,,还得调用父类的,在父类的析构函数当中,还得把虚表赋值为父类的那个虚表,,,父类和子类的虚表是不一样的
2018-12-20 17:41
0
游客
登录 | 注册 方可回帖
返回
//