【问题标题】:Delphi virtual constructor [duplicate]Delphi虚拟构造函数[重复]
【发布时间】:2017-07-10 11:18:17
【问题描述】:

我阅读this 的文章是因为我想了解class of [ClassName] 的用处,并且我看到他们声明了一个虚拟构造函数。所以我做了一个测试,你可以在这里看到:

我(从那篇文章中)了解到,当我在编译时不知道要构造的类并且我可以使用 class of 时,虚拟构造函数很有用。在我上面显示的代码中,有什么区别?

如果我将 TFirst 构造函数声明为虚拟而不覆盖 TSecond,我当然会收到警告,我可以通过重新引入或覆盖来删除它。但是构造函数不是被自动覆盖了吗(看左边的代码)?我认为他们是等价的。

【问题讨论】:

  • 不要对代码使用屏幕截图!您可以粘贴语法突出显示的代码 - 使用 {} 按钮或查看 here
  • 它们不等价。如果您尝试通过类引用创建实例,您会发现差异。我很确定文档涵盖了这一点。是吗?
  • @RaffaeleRossi 正如大卫指出的那样,它在文档中。要直接回答两个代码是否相等的问题,请参阅:“通过类类型标识符调用时,声明为虚拟的构造函数等效于静态构造函数。但是,当与类引用类型结合使用时,虚拟构造函数允许对象的多态构造"

标签: delphi delphi-10.2-tokyo


【解决方案1】:

使用这两种变体执行此代码,您将看到不同之处。

type
  TFirstClass = class of TFirst;

constructor TFirst.Create;
begin
  Writeln('TFirst.Create');
end;

constructor TSecond.Create;
begin
  Writeln('TSecond.Create');
end;

var
  firstClass: TFirstClass;
  first: TFirst;
begin
  firstClass := TSecond;
  first := firstClass.Create;
end.

【讨论】:

  • 好的,谢谢 Stefan,但实际上我的问题是:如果我使用虚拟/覆盖(在父/子的构造函数中)有什么区别吗?一般来说,我的意思是
  • 我认为执行示例代码非常清楚地显示了差异
  • 使用此答案中显示的代码作为您给定声明的实现,@Raffaele。在非虚拟情况下,您只会看到一条有关TFirst 的消息,而在虚拟情况下,您将看到一条有关TSecond 的消息。 (但请注意:在两种情况下,检查first is TSecond 将返回True!)
  • 好的,我想我明白了。在上面的代码中,可以看到带有虚拟/覆盖的“TSecond.Create”,因为我将重新定义(实际上是覆盖)构造函数。如果没有虚拟/覆盖,我没有给出 TSecond.Create 的新定义(实际上我没有覆盖),所以我看到了 TFirst.Create。我想我的想法是正确的
  • @Raffaele:如果没有虚拟构造函数,则使用为类型 (TFirstClass --> class of TFirst) 声明的构造函数。但是使用虚拟构造函数,你会得到 actual 的构造函数,而不是 declared 类的构造函数,并且实际课程是TSecond。这与虚拟和非虚拟普通方法相同。
猜你喜欢
  • 2011-07-16
  • 2013-12-30
  • 1970-01-01
  • 2017-12-05
  • 2016-04-09
  • 2022-11-17
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多