AppleStar

  • Increase font size
  • Default font size
  • Decrease font size
首页 Developer DotNet virtual , dynamic, override的区别是什么

virtual , dynamic, override的区别是什么

E-mail 打印 PDF
例如下面一段代码:      
faq-it.org/samba/        procedure  DoClose(var  Action:  TCloseAction);  dynamic;  
       procedure  DoCreate;  virtual;  
       procedure  DoDestroy;  virtual;  
       procedure  DoHide;  dynamic;  
       procedure  DoShow;  dynamic;  
       function  GetClientRect:  TRect;  override;  
 
 
---------------------------------------------------------------  
 
1、override表示以继承的父类方法  
2、virtual(虚拟方法)和dynamic(动态方法)表示:后代类可以override祖先的同名方法,在override过程的实现里,还可以用inherited调用祖先的同名方法,virtual(虚拟方法)和dynamic(动态方法)两者的差异在于方法指针的保存,virtual方法使用VMT(Virtual  Method  Table),也就是说,每一个该类的后代类都拥有整个的VMT,其优点在于速度快,因为类的实例可以直接从VMT中找到该方法的入口,但它也耗用较多的内存;相对的dynamic方法则不使用VMT,如果类的后代没有override该方法,那么需要从它的父类去查找方法的入口,它的优点是少用内存,因为子类只保留它override的方法入口,缺点是速度较慢,尤其在多级继承的时候,可能需要前溯好多层才找到方法的。  
3、一般的理解是,如果该方法其后代类基本都需要override的,使用virtual,如果该方法不经常在后代类中被override的,使用dynamic。  
 
---------------------------------------------------------------  
 
dynamic:动态方法,作用和virtual一样,都是可以覆盖的虚方法,只不过一个侧重于节省内存,一个侧重于提高速度  
override  :覆盖啊,覆盖用dynamic,virtual声明的虚方法或动态方法。  
 
 
---------------------------------------------------------------  
 
VCL以virtual  ,  dynamic,  override实现多态特性  
---------------------------------------------------------------  
 
dynamic方法使用DMT(Dynamic  Method  Table)  
 
由于dynamic节省内存,因此不经常被覆盖时,dynamic在调用时可以快速地找到入口。而此时如果用virtual时,占用较多内存,而速度并无明显提高(因为子类覆盖父类情况较少),所以应选用dynamic。  
同理,而覆盖较多时,择使用virtual。  

最后更新于: 2007-02-07 10:42  

添加评论


验证码
刷新

用户登录

ADS