gpt4 book ai didi

Delphi 意外的覆盖行为

转载 作者:行者123 更新时间:2023-12-03 15:06:44 26 4
gpt4 key购买 nike

打开你的时间机器,参观远古时代:这是德尔福,现在是 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 对象并调用太函数时,它会按预期工作:

  • GetName() => 基类
  • GetMaxim() =>有人给我们设置了炸弹。

继承人的实例也是如此:

  • GetName() => 继承人
  • GetMaxim() =>您的所有基地都属于我们!

现在我将 Heir 实例转换为 Base 并再次调用这两个函数。

  • GetName() => 基类,不会留下任何问题,
  • GetMaxim() =>您的所有基地都属于我们!正如预期的那样,因为它被继承人覆盖。

出于好奇,我向 Heir 添加了另外两个功能。

function Heir.GetBaseName: String;
begin
Result := inherited GetName();
end;

function Heir.GetBaseMaxim: String;
begin
Result := inherited GetMaxim();
end;

我希望GetBaseName()给我Base-Class - 所以它发生了。对于 GetBaseMaxim() 我不确定。我认为三件事是可能的

  1. 它不会编译并抛出错误或
  2. 它运行并会失败并出现异常(因为继承的函数被覆盖或
  3. 最期待的是它会给我继承人的GetMaxim(),告诉我你所有的基地都属于我们!

这两种情况都没有发生!我从我的基类中得知有人给我们设置了炸弹。?!为什么?我以为这个函数被继承人覆盖了!这没什么大不了的,但我不太理解这种行为,因为它没有按我的预期工作。有什么解释吗?

最佳答案

Inherited 为祖先函数提供非虚拟分派(dispatch),这正是您所观察到的。大多数情况下,在后代类中使用的函数与被调用的继承函数具有相同的名称,但正如您所演示的,不需要该自定义。您可以从后代类中的任何位置非虚拟地调用任何继承的方法。

关于Delphi 意外的覆盖行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35885954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com