Delphi 为什么';当通过元类工厂实例化时,派生构造函数是否被调用?

Delphi 为什么';当通过元类工厂实例化时,派生构造函数是否被调用?,delphi,class,constructor,Delphi,Class,Constructor,我试图在Delphi2007中创建一个类工厂。我想将派生类类型传递到函数中,并让它构造该类类型的对象 我已经找到了一些很好的参考资料,例如,但是我仍然不能让它正常工作。在下面的测试中,我无法让它调用派生构造函数,即使调试器告诉我oClass是tmydrive 我想我对一些基本的东西感到困惑,需要一些解释。谢谢 program ClassFactoryTest; {$APPTYPE CONSOLE} uses SysUtils; // BASE CLASS type TMyBase =

我试图在Delphi2007中创建一个类工厂。我想将派生类类型传递到函数中,并让它构造该类类型的对象

我已经找到了一些很好的参考资料,例如,但是我仍然不能让它正常工作。在下面的测试中,我无法让它调用派生构造函数,即使调试器告诉我oClass是tmydrive

我想我对一些基本的东西感到困惑,需要一些解释。谢谢

program ClassFactoryTest;
{$APPTYPE CONSOLE}
uses
  SysUtils;

//  BASE CLASS
type
  TMyBase = class(TObject)
    bBaseFlag : boolean;
    constructor Create; virtual;
  end;
  TMyBaseClass = class of TMyBase;

constructor TMyBase.Create;
begin
  bBaseFlag := false;
end;

//  DERIVED CLASS
type
  TMyDerived = class(TMyBase)
    bDerivedFlag : boolean;
    constructor Create;
  end;

constructor TMyDerived.Create;
begin
  inherited;
  bDerivedFlag := false;
end;

var
  oClass: TMyBaseClass;
  oBaseInstance, oDerivedInstance: TMyBase;
begin
  oClass := TMyBase;
  oBaseInstance := oClass.Create;

  oClass := TMyDerived;
  oDerivedInstance := oClass.Create;  // <-- Still calling Base Class constructor
end.
程序类工厂测试;
{$APPTYPE控制台}
使用
SysUtils;
//基类
类型
TMyBase=class(TObject)
bbbaseflag:布尔型;
构造函数创建;事实上的
结束;
TMyBase类=TMyBase的类;
构造函数TMyBase.Create;
开始
bBaseFlag:=假;
结束;
//派生类
类型
tmydrived=class(TMyBase)
b驱动标志:布尔值;
构造函数创建;
结束;
构造函数tmydrived.Create;
开始
继承;
b驱动标志:=假;
结束;
变量
oClass:TMyBaseClass;
Obseinstance、oDerivedInstance:TMyBase;
开始
oClass:=TMyBase;
oBaseInstance:=oClass.Create;
oClass:=tMyDrived;

ODeriveInstance:=oClass.Create;// 您忽略了在派生类构造函数上指定
override
。(我希望编译器会发出关于隐藏基类方法的警告。)添加该警告,您将看到
tmydrived.Create
called

TMyDerived = class(TMyBase)
  bDerivedFlag : boolean;
  constructor Create; override;
end;

另一种选择是,由于构造函数不带任何参数,所以放弃虚拟构造函数,只覆盖
AfterConstruction

+1,但是
就是放弃虚拟构造函数,而只是覆盖后期构造。
呃,这是多么令人困惑的非标准。请坚持使用构造函数使用
AfterConstruction
的唯一问题是它没有明确目的。子类化和添加非重写构造函数将很容易。虚拟构造器可以清楚地说明这一点。也就是说,如果你犯了这个错误,你的代码将无法工作,我一直认为这是一个极好的安全网!