Delphi动态创建对象时如何调用正确的构造函数?
Delphi 2006动态创建对象调用错误构造函数的解决方法
问题核心
基类TPCEItem未声明构造函数,导致类类型TPCEItemClass = class of TPCEItem的Create方法绑定到TObject.Create(非虚方法),即便ItemClass实际为TPCEProc,调用ItemClass.Create时仍会执行TObject.Create,无法触发子类的初始化逻辑,进而引发访问违规。
解决步骤
修改基类TPCEItem,添加虚拟构造函数
在基类中声明虚拟构造函数,让类引用能够识别子类的构造函数实现:TPCEItem = class(TObject) {base class for PCE items} private <irrelevent stuff> public constructor Create; virtual; // 新增虚拟构造函数 <irrelevent stuff> end;实现基类构造函数(空实现即可,确保继承链完整):
constructor TPCEItem.Create; begin inherited; // 调用TObject.Create end;子类TPCEProc的构造函数添加override关键字
子类构造函数重写基类的虚拟构造函数,确保动态调用时触发子类初始化逻辑:TPCEProc = class(TPCEItem) {class for procedures} protected <irrelevent stuff> public <irrelevent stuff> constructor Create; override; // 重写基类虚拟构造函数 destructor Destroy; override; end;保留子类构造函数的原有初始化逻辑:
constructor TPCEProc.Create; begin inherited; // 先调用基类构造函数 // 初始化TStringLists等成员,例如: FParamList := TStringList.Create; end;验证调用逻辑
修改后,AItem := ItemClass.Create;会根据ItemClass的实际类型(TPCEProc)调用对应构造函数,正确初始化所需成员。
原理说明
基类声明虚拟构造函数后,类类型TPCEItemClass的Create方法会绑定到基类的虚拟方法,动态调用时会根据实际子类类型(TPCEProc)找到对应的重写构造函数,而非直接执行TObject.Create。
内容的提问来源于stack exchange,提问作者kdtop
相关产品推荐
相关产品推荐

