Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi虚拟构造函数_Delphi_Delphi 10.2 Tokyo - Fatal编程技术网

Delphi虚拟构造函数

Delphi虚拟构造函数,delphi,delphi-10.2-tokyo,Delphi,Delphi 10.2 Tokyo,我之所以阅读这篇文章,是因为我想了解[ClassName]的类的有用性,我已经看到它们声明了一个虚拟构造函数。我做了一个测试,你可以在这里看到: 我(从那篇文章中)了解到,当我在编译时不知道要构造的类时,虚拟构造函数很有用,我可以使用的类。在我上面展示的代码中,有什么区别 如果我在不重写TSecond的情况下将TFirst构造函数声明为virtual,我将得到警告,当然,我可以通过重新引入或重写来删除该警告。但是构造函数不是自动重写的吗(看左边的代码)?我认为它们是等价的。使用这两个变体执行此

我之所以阅读这篇文章,是因为我想了解[ClassName]的
类的有用性,我已经看到它们声明了一个虚拟构造函数。我做了一个测试,你可以在这里看到:

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


如果我在不重写TSecond的情况下将TFirst构造函数声明为virtual,我将得到警告,当然,我可以通过重新引入或重写来删除该警告。但是构造函数不是自动重写的吗(看左边的代码)?我认为它们是等价的。

使用这两个变体执行此代码,您将看到差异

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.

使用这两个变量执行此代码,您将看到差异

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.

请不要在代码中使用截图!您可以粘贴语法突出显示的代码-使用
{}
按钮或外观。它们不是等效的。如果试图通过类引用创建实例,您将发现一个差异。我很确定文档中包含了这一点。是吗?文档:阅读时一定要谨慎documentation@RaffaeleRossi正如大卫指出的,这是在医生上。要直接回答您的问题,如果这两个代码相等或不相等,请参见以下内容:“当通过类类型标识符调用时,声明为虚拟的构造函数相当于静态构造函数。但是,当与类引用类型结合使用时,虚拟构造函数允许对象的多态构造”请不要使用代码截图!您可以粘贴语法突出显示的代码-使用
{}
按钮或外观。它们不是等效的。如果试图通过类引用创建实例,您将发现一个差异。我很确定文档中包含了这一点。是吗?文档:阅读时一定要谨慎documentation@RaffaeleRossi正如大卫指出的,这是在医生上。要直接回答您的问题,这两个代码是否相等,请参见以下内容:“当通过类类型标识符调用时,声明为虚拟的构造函数等效于静态构造函数。但是,当与类引用类型结合使用时,虚拟构造函数允许对象的多态构造”好的,谢谢Stefan,但实际上我的问题是:如果我使用vritual/override(在父/子构造函数中)与否有什么区别吗?一般来说,我的意思是,我认为执行示例代码可以非常清楚地显示差异。请使用此答案中显示的代码作为给定声明的实现,@Raffaele。在非虚拟情况下,您将只看到一条关于
TFirst
的消息,而在虚拟情况下,您将看到一条关于
TSecond
的消息。(但要注意:在这两种情况下,检查
first is TSecond
将返回
True
!)好的,我想我知道了。在上面的代码中,可以看到“TSecond.Create”和virtual/override,因为我将重新定义(实际上是使用override)构造函数。没有virtual/override,我不会给出TSecond.Create的新定义(事实上我没有override),因此我看到了TFirst.Create。我想我的想法是correct@Raffaele:如果没有虚拟构造函数,则使用为类型(
TFirstClass
-->
TFirst的类
)声明的构造函数。但是使用虚拟构造函数,可以得到实际类的构造函数,而不是声明类的构造函数,实际类是
TSecond
。这与虚方法和非虚方法是一样的。好的,谢谢Stefan,但实际上我的问题是:如果我使用vrital/override(在父/子构造函数中)与否有什么区别吗?一般来说,我的意思是,我认为执行示例代码可以非常清楚地显示差异。请使用此答案中显示的代码作为给定声明的实现,@Raffaele。在非虚拟情况下,您将只看到一条关于
TFirst
的消息,而在虚拟情况下,您将看到一条关于
TSecond
的消息。(但要注意:在这两种情况下,检查
first is TSecond
将返回
True
!)好的,我想我知道了。在上面的代码中,可以看到“TSecond.Create”和virtual/override,因为我将重新定义(实际上是使用override)构造函数。没有virtual/override,我不会给出TSecond.Create的新定义(事实上我没有override),因此我看到了TFirst.Create。我想我的想法是correct@Raffaele:如果没有虚拟构造函数,则使用为类型(
TFirstClass
-->
TFirst的类
)声明的构造函数。但是使用虚拟构造函数,可以得到实际类的构造函数,而不是声明类的构造函数,实际类是
TSecond
。这与虚拟和非虚拟普通方法相同。