例如下面一段代码:  
    procedure DoClose(var Action: TCloseAction); dynamic;
    procedure DoCreate; virtual;
    procedure DoDestroy; virtual;
    procedure DoHide; dynamic;
    procedure DoShow; dynamic;
    function GetClientRect: TRect; override;

解决方案 »

  1.   

    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。
      

  2.   

    dynamic:动态方法,作用和virtual一样,都是可以覆盖的虚方法,只不过一个侧重于节省内存,一个侧重于提高速度
    override :覆盖啊,覆盖用dynamic,virtual声明的虚方法或动态方法。
      

  3.   

    VCL以virtual , dynamic, override实现多态特性
      

  4.   

    to cg1120
    你的第三点怎么理解?可否详细说说 好象和第2点没有什么必然的联系啊
      

  5.   

    dynamic方法使用DMT(Dynamic Method Table)
    你的第三点怎么理解?
    由于dynamic节省内存,因此不经常被覆盖时,dynamic在调用时可以快速地找到入口。而此时如果用virtual时,占用较多内存,而速度并无明显提高(因为子类覆盖父类情况较少),所以应选用dynamic。
    同理,而覆盖较多时,择使用virtual。