Delphi意外的覆盖行为
打开时间机器,参观古代:它是德尔福,它是2007年.
对于我们的初学者手册,我写下了编程的一些基本内容(使用Delphi).这样做我发现了一个怪癖,我不太明白.为了演示继承,我写了一个基类和它的继承人.重新引入功能,另一个功能被继承人覆盖. unit UOverride; interface type Base = class(TObject) strict private const CName: String = 'Base-Class'; CMaxim: String = 'Somebody set up us the bomb.'; public function GetName(): String; virtual; function GetMaxim(): String; virtual; end; Heir = class(Base) strict private const CName: String = 'Heir-Class'; CMaxim: String = 'All your Base are belong to us!'; public function GetName(): String; reintroduce; function GetMaxim(): String; override; function GetBaseName(): String; function GetBaseMaxim():String; end; implementation { Base } function Base.GetMaxim: String; begin Result := CMaxim; end; function Base.GetName: String; begin Result := CName; end; { Heir } function Heir.GetMaxim: String; begin Result := CMaxim; end; function Heir.GetName: String; begin Result := CName; end; end. 因此,当我创建Base的对象并调用too函数时,它按预期工作: > GetName()=>基类和 对于继承人的实例也是如此: > GetName()=>继承人和 现在我将我的Heir实例转换为Base并再次调用这两个函数. > GetName()=>没有问题的基类 出于好奇,我向继承人增加了两个功能. function Heir.GetBaseName: String; begin Result := inherited GetName(); end; function Heir.GetBaseMaxim: String; begin Result := inherited GetMaxim(); end; 我希望GetBaseName()给我Base-Class – 所以它发生了.对于GetBaseMaxim(),我不确定.在我看来,有三件事是可能的 >它不编译并抛出错误或 都没发生!我得到有人给我们炸弹.来自我的基础课程?!为什么?我认为这个功能被Heir覆盖了!这不是什么大问题,但我不太了解这种行为,因为它不能像我预期的那样工作.有什么解释吗? 解决方法
Inherited给祖先函数提供非虚拟调度,这正是你观察到的.大多数情况下,它在后代类中使用的函数与被调用的继承函数具有相同的名称,但正如您所演示的那样,不需要该自定义.您可以从后代类中的任何位置非虚拟地调用任何继承的方法.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |