D delphi0808 Unregistered / Unconfirmed GUEST, unregistred user! 2009-06-25 #1 后代对象能覆盖任何继承的虚拟方法。=====================后代vmt中,还保存父对象被覆盖的虚方法地址吗?覆盖一个方法是扩展它,而不是取代它.==========================既然覆盖了,为什么说不是取代它?
后代对象能覆盖任何继承的虚拟方法。=====================后代vmt中,还保存父对象被覆盖的虚方法地址吗?覆盖一个方法是扩展它,而不是取代它.==========================既然覆盖了,为什么说不是取代它?
D delphi0808 Unregistered / Unconfirmed GUEST, unregistred user! 2009-06-25 #2 知道了1.会保存父对象被覆盖的虚方法地址,不然子对象无法调用父对象的方法了2.覆盖:保留父对象虚方法的功能,并在此基础上对其扩展,否则没必要覆盖,直接写一个新方法就是了不知这样理解正确否?
L liuls Unregistered / Unconfirmed GUEST, unregistred user! 2009-06-25 #3 覆盖(override); 后代 vmt 表中保存有祖先类的虚拟方法地址;动态(dynamic); 后代 vmt 表中才不保存祖先类的动态方法地址; 要继承时要到父类 vmt 中去查找重定义(reintroduce); 这个才是取代祖先类的方法地址
覆盖(override); 后代 vmt 表中保存有祖先类的虚拟方法地址;动态(dynamic); 后代 vmt 表中才不保存祖先类的动态方法地址; 要继承时要到父类 vmt 中去查找重定义(reintroduce); 这个才是取代祖先类的方法地址
L liuls Unregistered / Unconfirmed GUEST, unregistred user! 2009-06-30 #5 错,是消息处理选择了动态方法, 你其它的方法也可以用动态方法的.至于 virtual 与 dynamic 的区别可能不太好理解, virtual 在子类 vmt 里存有, 而 dynamic 在子类没声明, 就只在祖先类才有(如果祖先类中有声明过), 这样有一个 vmt 大小及查找速度问题: vmt 大小 方法查找速度virtaul 大 快dynamic 小 慢(如果类继承层次不多话是很难体现出来的)
错,是消息处理选择了动态方法, 你其它的方法也可以用动态方法的.至于 virtual 与 dynamic 的区别可能不太好理解, virtual 在子类 vmt 里存有, 而 dynamic 在子类没声明, 就只在祖先类才有(如果祖先类中有声明过), 这样有一个 vmt 大小及查找速度问题: vmt 大小 方法查找速度virtaul 大 快dynamic 小 慢(如果类继承层次不多话是很难体现出来的)