加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

理解 Delphi 的类(十一) - 深入类中的方法[1] - 虚方法与动态方

发布时间:2020-12-15 10:03:24 所属栏目:大数据 来源:网络整理
导读:转载自:?http://www.cnblogs.com/del/archive/2008/01/15/1039998.html 方法来到类中,以前的特点基本都在; 因为类一般是存在于一个继承链中,所以就有了一些新的概念,譬如: 继承、覆盖; 也有了很多新名称,譬如: 静态方法、虚方法、动态方法、抽象方法、类方

转载自:?http://www.cnblogs.com/del/archive/2008/01/15/1039998.html


方法来到类中,以前的特点基本都在;

因为类一般是存在于一个继承链中,所以就有了一些新的概念,譬如: 继承、覆盖;
也有了很多新名称,譬如: 静态方法、虚方法、动态方法、抽象方法、类方法、消息方法.


先从虚方法与动态方法开始吧
//下面的类中就定义了两个虚方法(virtual)、两个动态方法(dynamic)
TMyClass = class
? procedure Proc1(x,y: Real); virtual;
? function Fun1(x,y: Real): Real; virtual;
? procedure Proc2(x,y: Real); dynamic;
? function Fun2(x,y: Real): Real; dynamic;

end;


//定义成虚方法或动态方法,就意味着在后来的子类中将要被覆盖(override),也就是重写
TBass = class
? procedure Proc(x,y: Real); virtual;
? function Fun(x,y: Real): Real; dynamic;
end;


TChild = class(TBass)
? procedure Proc(x,y: Real); override;
? function Fun(x,y: Real): Real; override;
end;


{正是因为这种机制而形成了多态}

//那虚方法和动态方法有什么区别呢?
每个类都内含着两个表: 虚方法表(VMT)和动态方法表(DMT);
VMT 表包含着本类与其所有父类的虚方法 - 那一般会是一个比较庞大的表;
DMT 表只包含本类的动态方法 - 如果要调用其上层类的动态方法,只能逐级查找; 因此,使用虚方法速度上会有优势,使用动态方法会节约内存; 在 Delphi 初期只有 virtual 而没有 dynamic ; 后来随着 VCL 日渐庞大,才有了 dynamic ; 譬如类的事件方法一般都是在早期定义,为了节约空间,事件方法在 VCL 中基本都定义成了 dynamic ; 这样看来: virtual 和 dynamic 并没有太多区别,一个侧重速度、一个节约空间; 它们是可以互相代替的! 另外: 因为它们区别不大,并且是先有 virtual,所以人们也习惯于把"虚方法"和"动态方法"都称作"虚方法".

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读