例如下面一段代码:
procedure DoClose(var Action: TCloseAction); dynamic;
procedure DoCreate; virtual;
procedure DoDestroy; virtual;
procedure DoHide; dynamic;
procedure DoShow; dynamic;
function GetClientRect: TRect; override;
procedure DoClose(var Action: TCloseAction); dynamic;
procedure DoCreate; virtual;
procedure DoDestroy; virtual;
procedure DoHide; dynamic;
procedure DoShow; dynamic;
function GetClientRect: TRect; 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。
override :覆盖啊,覆盖用dynamic,virtual声明的虚方法或动态方法。
你的第三点怎么理解?可否详细说说 好象和第2点没有什么必然的联系啊
你的第三点怎么理解?
由于dynamic节省内存,因此不经常被覆盖时,dynamic在调用时可以快速地找到入口。而此时如果用virtual时,占用较多内存,而速度并无明显提高(因为子类覆盖父类情况较少),所以应选用dynamic。
同理,而覆盖较多时,择使用virtual。