社区
Delphi
帖子详情
讨论一下,virtual与dynamic的区别
Tompage
2001-08-18 03:00:04
...全文
210
20
打赏
收藏
讨论一下,virtual与dynamic的区别
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Tompage
2001-08-25
打赏
举报
回复
真的没有别的意见了吗???踊跃发言阿!
Tompage
2001-08-23
打赏
举报
回复
up一下,再看看大家的意见
Tompage
2001-08-22
打赏
举报
回复
就我个人看法,当一个子类从父类继承过来时,应该对父类没有任何变化,但是父类又如何得到子类的VMT呢?
csdn72
2001-08-22
打赏
举报
回复
gz
Tompage
2001-08-22
打赏
举报
回复
但是VMT是如何生成的,调用时又是如何访问VMT的呢,DMT又是怎样的呢?
Scarlette
2001-08-22
打赏
举报
回复
父类是不可能得到子类的VMT的。因为VMT的查找方式是从子类向父类逆推的。
Tompage
2001-08-20
打赏
举报
回复
再up一下
Nicrosoft
2001-08-20
打赏
举报
回复
dynamic在一定程度上,阻止了虚函数表由于类层次扩展而变得非常庞大(类爆炸?)
Tompage
2001-08-19
打赏
举报
回复
怎么没人跟贴了?UP一下
xzm2000
2001-08-19
打赏
举报
回复
关注起来
trainbox
2001-08-19
打赏
举报
回复
gz
Tompage
2001-08-19
打赏
举报
回复
但是,对动态方法的调用过程还是不太理解
比如,从某个类Ta派生一个子类Tb,重载了动态方法c,那么这时候类Tb和Ta的DMT表是怎样的,调用过程又是怎样的呢?
如果是虚拟方法又如何呢??
Tompage
2001-08-19
打赏
举报
回复
多谢各位大虾的指点,小弟明白了!
qqcxg
2001-08-18
打赏
举报
回复
动态方法和虚方法在功能上类同,差别只在于Delphi对于它们内部实现方式不同,
对于虚方法,Delphi会创建一个虚拟方法表(VirtualMethodTable)用以加速索引,这就造成了消耗内存资源多一点;而动态方法相比较而言,由于没有VMT支持,速度稍慢,但更节约资源.
如果你在类中要定义许多方法,而这些方法又不是都经常被调用,则应将它们定义为动态方法,事实上Borland便是这么作的!!
dancemaple
2001-08-18
打赏
举报
回复
在代码中调用一个虚拟方法时,编译器并不知道它的地址。因此,编译器通过建立虚拟方法表(VMT)来查找在运行时的函数地址。所以,虚拟方法比动态方法用的内存要多,但它执行得比较快。
对于动态方法,编译器为每一个动态方法指定一个独一无二的数字,用这个数字和动态方法的地址构造一个动态方法表(DMT),在DMT表中仅有它声明的动态方法,并且这个方法需要祖先的DMT表来访问它其余的动态方法。所以,动态方法比虚拟方法用的内存要少,但执行要慢,因为有可能要到祖先类的DMT表中查找动态方法。
以上说明摘抄自《D5 开发人员指南》
另外,这里说的重载不合适。重载是指关键字overload,而orerride一般翻译成“覆盖”
zzutlink
2001-08-18
打赏
举报
回复
葡萄!你太夸张了吧?呵呵
Tompage
2001-08-18
打赏
举报
回复
除了速度的差别外,应该还有其他区别吧?
Mickey_Chue
2001-08-18
打赏
举报
回复
DELPHI中方法的类型及其覆盖、重载
Mickey_Chue(菩提葡萄)
1、静态方法是方法的缺省类型,对它就像对通常的过程和函数那样调用,编译器知道这些方法的地址,所以调用一个静态方法时它能把运行信息静态地链接进可执行文件,所以,静态方法速度最快,但它们却不能被覆盖来支持多态性。
2、虚拟方法和静态方法的调用方式相同。由于虚拟方法能被覆盖,在代码中调用一个指定的虚拟方法时编译器并不知道它的地址,因此,编译器通过建立虚拟方法表(VMT)来查找在运行时的函数地址。所有的虚拟方法在运行时通过VMT来高度,一个对象的VMT表中除了自己定义的虚拟方法外,还有它的祚的所有的虚拟方法,因此虚拟方法比动态方法用的内存要多,但它执行得比较快。
3、动态方法跟虚拟方法基本相似,只是它们的高度系统不同。编译器为每一个动态方法指定一个独一无二的数字,用这个数字和动态方法的地址构造一个动态方法表(DMT)。不像VMT表,在DMT表中仅有它声明的动态方法,并且这个方法需要祖先的DMT表来访问它蓁的动态方法。正因为这样动态方法比虚拟方法用的内存要少,但执行起来罗慢,因为有可能要到祚对象的DMT中查找动态法。
4、OP通过覆盖使一方法在不同的派生类间表现出不同的行为。OP中能被覆盖的方法是在声明时被标识为virtual或dynamic的方法。为了覆盖一个方法,在派生类的声明中用override代替virtual或dynamic。用了override后,编译器就会用新的方法替换VMT中原先的方法,而原先的方法也还存在,而如果用override再次声明一个静态方法,则是真正的覆盖,是用新的方法完全替换在祖先类中的同明方法。
5、方法重载的意义:比如说,你要写一个求两数商的函数(当然只是个比喻),你希望这个函数可以处理所有的数值类型,但PASCAL的运算对类型实行严格检查,你不得不用不同的程序来运算不同类型的数值,这样你就必须为每一种类型写一个同样功能的函数,并使用不同的函数名,坏处我想你是知道的。而重载却可以解决这个问题,同样的函数名,编译器可以用不同的形参类型决定调用哪个函数。
zzutlink
2001-08-18
打赏
举报
回复
virtual是虚拟的,通过VMT(VIRTUAL METHOD TABLE,虚拟方法表),执行速度快
dynamic是动态的,通过DMT(DYNAMIC METHOD TABLE,动态方法表),执行速度相对慢
两者均可重载!
Tompage
2001-08-18
打赏
举报
回复
如何重载??
Exceptional C++中文版
C++经典教程,C++必读系列
现MFC扩展DLL中导出类和对话框
http://tech.ddvip.com/2007-03/117396292221262.html
C++程序设计_中型项目 游戏"双人大战"的控制台实现.pdf
小组项目游戏"双人大战"的控制台指令实现 本次实验旨在主要对前期学习的有关C++面向对象部分的多态性知识进行实践操作,并综合前期的全部有关面向对象的内容,完成项目。 在理论方面主要体现了: 1.面向对象的抽象思维分析; 2.对继承关系的分析和实践应用; 3.对虚基类(
virtual
base class),派生类,类的实例化,动态联编(
dynamic
binding)等体现面向对象多态性内容的体现; 4.小组合作完成同意大型项目的配合能力,; 在实际操作方面,本次试验重点训练了: 1.继承关系的创建,与相关成员函数之间的调用关系; 2.虚基类的创建和多态的体现; 3.小组对项目问题讨论出的问题和解决方案;
C中的继承和多态
博文:程序设计基石与实践系列之C中的继承和多态代码http://blog.csdn.net/songzitea/article/details/48866073
深入解析C++中的动态类型转换与静态类型转换运算符
主要介绍了C++中的动态类型转换与静态类型转换运算符,即
dynamic
_cast与static_cast的用法,需要的朋友可以参考下
Delphi
5,927
社区成员
262,931
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章