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