博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转:虚拟方法跳过父类继承调用祖父类的代码 --值得试一试
阅读量:6426 次
发布时间:2019-06-23

本文共 1155 字,大约阅读时间需要 3 分钟。

网友说是 hack 手段,还没有时间深入了解,不明觉厉。

[沪]风舞轻扬(81924320) 2016-10-25 16:59:08

 

TGrandpaObject = classpublic  procedure AVirtualMethod; virtual;end;TParentObject = class(TGrandpaObject)public  procedure AVirtualMethod; override;end;TCurrentObject = class(TParentObject)public  procedure AVirtualMethod; override;end;TCurrentObject的AVirtualMethod虚拟方法不希望调用父类TParentObject的AVirtualMethod方法的实现代码,而要直接继承调用祖父类TGrandpaObject的AVirtualMethod方法代码。类的继承体系中,在VMT中,子类的VMT完全包含父类的VMT,而自身的虚拟方法则是附着在VMT父类虚拟方法表的后面,也就是说子类虚拟方法和父类虚拟方法的相对偏移量是相同的,只是子类的虚拟方法有覆盖时,子类VMT中该虚拟方法的地址被覆盖啦。因此,要跳过父类的虚拟方法而直接调用祖父类的虚拟方法代码,那么只要通过VMT的虚拟方法的相对偏移量找到祖父类的虚拟方法地址,然后调用即可。procedure TCurrentObject.AVirtualMethod;begin  asm        MOV     EDX,VMTOFFSET AVirtualMethod // 虚拟方法VMT偏移量        MOV     EAX,Self                     // 对象实例 => EAX        MOV     ECX,[EAX]                    // 类VMT => ECX        MOV     ECX,[ECX].vmtParent        MOV     ECX,[ECX]                    // 父类VMT => ECX        MOV     ECX,[ECX].vmtParent        MOV     ECX,[ECX]                    // 祖父类VMT => ECX        MOV     ECX,[ECX+EDX]                // 祖父类虚拟方法地址 => ECX        CALL    ECX                          // 方法调用  end;end;

 

转载地址:http://onyga.baihongyu.com/

你可能感兴趣的文章
企业防泄密保护三大原则
查看>>
互联网共享经济思考:标准化与个性化如何融合
查看>>
局域网交换机灯同时闪动
查看>>
Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:继承查询...
查看>>
mail服务器中sendmail的搭建用法
查看>>
谈怎样才能成为优秀的前端工程师
查看>>
CSS如何居中一个float浮动元素?
查看>>
查看Windows服务器的CPU详细信息
查看>>
脚本备份smgpSendWriteFile
查看>>
网络的理解
查看>>
抛丸清理机的的安装步骤
查看>>
xib为view添加边框
查看>>
集合问题的总结
查看>>
集合的由来及集合继承体系图-学习笔记
查看>>
python--目录学习
查看>>
Oracle 表文件,表空间,用户,的创建 和删除,解锁用户
查看>>
cisco设备vty tacacs+认证配置
查看>>
浅析点对点(End-to-End)的场景文字识别
查看>>
Linux运维工程师面试题第六套
查看>>
2011.11.24
查看>>