大概內容如下:
TBase=class
procedure v1;virtual;
procedure v2;virtual;
procedure v3;virtual;
end;
TDerived=class(TBase)
procedure v2;override;
end;
則其VMT為:
TBase:
v1
v2
v3TDerived:
v1
TDerived.v2
v3
這樣的話TBase的v2不是被覆蓋勒,徹底找不到勒嗎?
我一直以為是這樣的:
TDerived:
v1
TBase.v2
v3
TDerived.v2
對delphi的override一直不太懂,請指點一下。

解决方案 »

  1.   

    哦,楼主一直以為的意思是不对!override就像你说的那样,是子类把父类的方法覆盖掉了,也就是说它找不到父类的方法了,但是子类方法中如果用inherited,就依然可以实现父类方法的功能!
      

  2.   

    举个例子
    procedure TDerived.hi;//子类覆盖
    begin
     inherited;
    showmessage('hihi');
    end;procedure TBase.hi;//父类声明的虚方法
    begin
    showmessage('hi');
    end;然后你创建子类对象,并调用hi这个方法,由于用了inherited,就可以看到它先是调用父类的hi方法,然后才执行showmessage('hihi');不用inherited的话,就完全覆盖了
      

  3.   

    从vmt看,既然已经覆盖了,怎么还能调用到呢?inherited是什么原理丫。还糊涂……
      

  4.   

    inherited后面如果不加方法名的话,就是调用父类的同名方法,如果加方法名则可以调用父类的任何方法,当然在有权限的情况下!
      

  5.   

    vmt偶不太了解,不过除非基类不是声明成VIRTUAL,而子类又声明了同名的方法,才会被完全覆盖而丢失,而声明成VIRTUAL就没有问题。
      

  6.   

    Inside VCL里不是讲的很清楚嘛??建议你把前几章好好看几遍,还不懂的话再来问!
    另外,<Delphi高手突破>也是非常OK的!
      

  7.   

    子类是从父类那派生出来的, VMT一层一层向上包.   (我瞎说的.)__________________________
    楼上的说的对.inherited后面如果不加方法名的话,就是调用父类的同名方法,如果加方法名则可以调用父类的任何方法,当然在有权限的情况下!