如:
TBase = Class
public
  procedure show;
end;TSub=class(TBase)
public
  procedure show;
end;implementionspublic TBase.show;
begin
  ...
end;public TSub.show;
begin
  inherited;
  ...
end;上面这段代码中,在运行时,会提示子类TSub的show方法隐藏了父类的show方法,但通过inherited可以调用到父类的同名方法,这和虚拟方法有何差别?为何还要虚拟方法?
如果将上面的show定义为虚拟方法,那也是通过inherited调用父类的方法呀。还请各位大侠指点,谢谢!

解决方案 »

  1.   

    这个问题我是这样认为:
    按OOP的理论原则,继承是必须要有的,而且是显式定义的,即在父类中要显式地定义哪些方法可以override,哪些不能override。
    delphi在编译时,并没有因楼主所用的方式而产生编译错误,只是给出了提示,这是delphi本身的特点,每种语言对于这类问题都有其不同的特点,例如:C#如果按楼主的方式编写类继承,会产生编译错误。
      

  2.   

    var
      objBase: TBase;
      objSub: TSub;
      objTmp: TBase;
    begin
      objBase := TBase.Create();
      objSub := TSub.Create();  objTmp := objBase;
      objTmp.Show;      // 调用TBase.Show  objTmp := objSub;
      objTmp.Show;      // 仍然是调用TBase.Show,因为objTmp是TBase且Show非虚方法,如果是虚方法则会调用TSub.Show  objBase.Free;
      objSub.Free;
    end;
      

  3.   

    抽象方法(absolute)在父类中是不用实现的,只是定义了一个方法的接口形式
    虚方法(virtual)在父类中是要实现的,并且可以在子类中通过inherited关键字对其继承