首页 > 解决方案 > 必须在第一行调用继承?

问题描述

我见过这样的一段代码(不是我的)。作者在调用inherited之前在构造函数的第一行设置了FField。我很好奇这段代码是否有效。

TTest = class(TBaseObject, ITest)
    private
    protected
        FField: TObject;  
    end; 


constructor TTest.Create(aField: TObject);
begin
    FField:= aField;
    inherited Create();
    ...
end;

我认为 FField 的内存已经分配并在那时被取消了。正确的?

标签: delphi

解决方案


代码有效。当您的构造函数运行时,实例已被分配并默认初始化。

在调用继承构造函数之前设置成员意味着如果继承构造函数访问该成员,它将读取调用派生构造函数提供的值。虽然继承的构造函数不能直接访问该成员,但在这种情况下,它可以通过调用虚拟方法来访问它。但是请注意,从构造函数调用虚方法是一种有点可疑的做法,因为实例可能是部分构造的。


推荐阅读