求教:关于继承(25)

  • 主题发起人 主题发起人 delphi0808
  • 开始时间 开始时间
D

delphi0808

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