gpt4 book ai didi

delphi - "Method ' %s ' hides virtual method of base type ' %s '"。到底隐藏了什么?

转载 作者:行者123 更新时间:2023-12-03 14:59:05 26 4
gpt4 key购买 nike

读完 Ian Boyd 后的构造函数系列问题( 1234 ),我意识到我不太明白隐藏内容的字面含义。

我知道(如果我错了,请纠正我)override的唯一目的是能够具有多态行为,以便运行时可以根据实际类型解析方法实例 - 与声明的类型相反。考虑以下代码:

type
TBase = class
procedure Proc1; virtual;
procedure Proc2; virtual;
end;

TChild = class(TBase)
procedure Proc1; override;
procedure Proc2; // <- [DCC Warning]
end;

procedure TBase.Proc1;
begin
Writeln('Base.Proc1');
end;
procedure TBase.Proc2;
begin
Writeln('Base.Proc2');
end;

procedure TChild.Proc1;
begin
inherited Proc1;
Writeln('Child.Proc1');
end;
procedure TChild.Proc2;
begin
inherited Proc2;
Writeln('Child.Proc2');
end;

var
Base: TBase;
begin
Base := TChild.Create;
Base.Proc1;
Writeln;
Base.Proc2;
Base.Free;
Readln;
end.

哪些输出:

Base.Proc1
Child.Proc1

Base.Proc2

TChild.Proc2 上的警告 states that此方法“将隐藏对同名基础方法的访问”。我看到的是,如果我不重写 Proc2,我就会失去该方法解析其实际类型的能力,而不是其基本类型的能力。如何隐藏对 base 方法的访问?

此外,记录下有关警告的文档作为警告的解决方案,其中指出:

First, you could specify override to make the derived class' procedure also virtual, and thus allowing inherited calls to still reference the original procedure.

现在,如果我从“TChild”(无多态性)创建“TChild”实例,则非重写方法中的继承调用显然引用原始过程。如果我从“TBase”创建“Child”实例,调用甚至不会解析为“TChild”方法,我怎么能调用引用任何内容的“Inherited”?

我有什么误解吗?

最佳答案

除此之外,您将无法定义

TGrandChild = class(TChild) 
procedure Proc2; override;
end;

因为 TGrandChild 看到的 Proc2 是来自 TChild 的非虚拟 Proc2。 TChild.Proc2 对后代隐藏 TBase.Proc2。

编辑:

回应 Sertac 的评论:

var 
Base: TBase;
Child : TChild
begin
Child := TChild.Create;
Base := Child;
Base.Proc2;
Child.Proc2;

Base.Free;
Readln;

这将输出

Base.Proc2
Base.Proc2
Child.Proc2

因此,看似两次调用同一方法实际上是调用 2 个不同的方法。这使得代码更难理解(这不实用)并产生意想不到的行为。

关于delphi - "Method ' %s ' hides virtual method of base type ' %s '"。到底隐藏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3878576/

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