关于类继承方面的一个问题(18)

  • 主题发起人 主题发起人 ykjt
  • 开始时间 开始时间
Y

ykjt

Unregistered / Unconfirmed
GUEST, unregistred user!
当子类覆盖了父类的一个虚方法后,子类想调用这个被覆盖了的父类方法,系统是如何实现的?
 
也即inherit 都干了什么?
 
inherit = call ParentFunctionPointer
 
你自己写一个,调用inherit,单步debug,看看到底怎么实现的不就OK了[:D]
 
这里分两种情况:dynamic(Index)和virtual(VMT)的处理是不一样的。
 
guanyue7613:讲讲吧
 
建议看下李维的《Inside VCL》这本书应该就明白了
 
(1) 上述语法表示调用父类的方法XXX,其中ParamsList表示参数列表。在前面我们已经说过,父类中除private外,其他域的方法对于子类都是可见的(如果没有显式指定域,则编译指令{$M}开启时,隐含为published域,否则为public域)。因此,inherited可以调用父类任何在private域以外的方法。(2) 如果直接使用“inherited”,没有指定方法名和参数,则表示调用父类的同名方法(但当父类有多个该同名方法时——如该方法已被重载,则inherited必须使用完整格式,否则编译器不能确定你到底要调用这些同名方法中的哪一个)。(3) 因为本质上,inherited就是调用父类的某个方法,所以和调用本类的某方法相比,并没有特别的不同。“inherited”仅仅就是告诉编译器:我要调用的是父类而不是其他类的方法而已。所以可以在任何地方使用它,例如条件中:静态方法:后代类只能覆盖祖先的同名方法,不能再引用祖先的同名方法;virtual(虚拟方法)和dynamic(动态方法):后代类可以override祖先的同名方法,在override过程的实现里还可以用inherited调用祖先的同名方法,两者的差异在于方法指针的保存,virtual方法使用VMT(Virtual Method Table),也就是说,每一个该类的后代类都拥有整个的VMT,其优点在于速度快,因为类的实例可以直接从VMT中找到该方法的入口,但它也耗用较多的内存;相对的dynamic方法则不使用VMT,如果类的后代没有override该方法,那么需要从它的父类去查找方法的入口,它的优点是少用内存,因为子类只保留它override的方法入口,缺点是速度较慢,尤其在多级继承的时候,可能需要前溯好多层才找到方法的。一般的理解是,如果该方法其后代类基本都需要override的,使用virtual,如果该方法不经常在后代类中被override的,使用dynamic。abstract(抽象方法),抽象方法是指该类只定义了方法的名字,但没有实现方法的部分,方法又其后代类去实现,含有抽象方法的类不能被实例化!
 
乱说乱讲
 
(子类对象 as T父类).方法 //这样就调用父类的方法子类对象 as T父类:这是把子类转化为父类
 
后退
顶部