社区
Delphi
帖子详情
讨论一下,virtual与dynamic的区别
Tompage
2001-08-18 03:00:04
...全文
252
20
打赏
收藏
讨论一下,virtual与dynamic的区别
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
如何重载??
static_cast 和
dynamic
_cast 的
区别
本文很多题目都是来源用于网上,如有侵权,请及时通知。和别人不同的是,有些题目加上了自己的思考。标记为【Jacob】第一部分:简答题1. 一下C++中static_cast 和
dynamic
_cast 的
区别
。答:static_cast 用于有比较明确定义的变换,包括不需要强制转换的变换。【others】l
dynamic
_cast 适用于类型安全的向下转换,常用在继承中的父类指针向子类指针的转...
override,overload,
dynamic
,
virtual
,abstract,reintroduce关键字
http://blog.csdn.net/zsy146/article/details/4168076 override,overload,
dynamic
,
virtual
,abstract,reintroduce关键字 override:用于覆盖一个
Virtual
或是
Dynamic
形式的方法.覆盖时必须沿用被覆盖方法的声明, 并且不允许修改原方法的参数和返回类型. overload:指出了
Delphi的OverRide、OverLoad、
Virtual
、
Dynamic
、Static方法
1.方法的重写Overriding 和重载Overloading 是Java多态性的不同表现 。重写Overriding 是父类与子类之间多态性的一种表现,重载Overloading 是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding )。
子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,它们或有
Delphi的OverRide、OverLoad和
Virtual
方法
Delphi的OverRide、OverLoad和
Virtual
方法1.方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调
inherited,
dynamic
,
virtual
, override , overload
inherited使用格式inherited XXX(ParamsList);表示使用父类中的名为XXX的方法,ParamList为方法的参数列表;调用时可不加方法名,表示调用父类中同名方法,若父类中有多个同名方法时不可用。待续
Delphi
5,943
社区成员
262,943
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章