如:
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调用父类的方法呀。还请各位大侠指点,谢谢!
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调用父类的方法呀。还请各位大侠指点,谢谢!
按OOP的理论原则,继承是必须要有的,而且是显式定义的,即在父类中要显式地定义哪些方法可以override,哪些不能override。
delphi在编译时,并没有因楼主所用的方式而产生编译错误,只是给出了提示,这是delphi本身的特点,每种语言对于这类问题都有其不同的特点,例如:C#如果按楼主的方式编写类继承,会产生编译错误。
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;
虚方法(virtual)在父类中是要实现的,并且可以在子类中通过inherited关键字对其继承