虚拟方法跳过父类继承调用祖父类的代码
来源:互联网 发布:电子配音软件下载 编辑:程序博客网 时间:2024/04/29 18:55
TGrandpaObject = class
public
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;
- 虚拟方法跳过父类继承调用祖父类的代码
- JAVA调用重写的祖父方法
- java调用祖父类里被父类重写了的实例方法
- 关于Qt如何在子类中继承祖父类
- 类的虚拟继承
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- C++中继承和调用父类的构造函数方法,外加MFC常见dialog继承
- 一个简单的子类继承父类私有方法代码
- 类说虚拟继承
- 继承、访问控制符、子类重载父类的方法、子类调用父类的方法
- python 继承 及调用被重写的父类方法(未被绑定的方法)
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
- 类的继承 和 父类中构造方法的调用
- C++类的多重继承与虚拟继承
- XML的二十个热点问题
- 一个研究生毕业以后的人生规划
- Delphi 对XML的支持---TXMLDocument类
- 《黑客精英》中文帮助(uplink)
- Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
- 虚拟方法跳过父类继承调用祖父类的代码
- 软件项目经理必备素质
- 多线程WIN32程序如何检查死锁(三)-使用Petri网络来表示多线程应用程序
- 重庆人看北京的川菜
- .Net中如何操作IIS(源代码)
- ASP.NET仅配置数据库MSDE出现"用户 ’机器名/ASPNET’ 登录失败 解决方法
- 用C++实现跨平台游戏开发之Allegro引擎
- 病毒名:W32.Lovgate.R@mm
- oralce约束及其状态