gpt4 book ai didi

delphi - delphi中名为create的函数的问题

转载 作者:行者123 更新时间:2023-12-03 15:09:40 26 4
gpt4 key购买 nike

我有一个这样声明的基类

type
TBaseClass=class
protected
constructor Create(LoadData:boolean;const Param1,Param2:string); overload;
public
Destructor Destroy; override;
end;

现在在另一个单元中,有一个子类TChid_Class,它源自TBaseClass

  TChid_Class=class(TBaseClass)
function Create(const Param1, Param2 : String;const Param3 : OleVariant ; var Param4 : LongInt): Integer;overload;
constructor Create; overload;
constructor Create(LoadData:boolean); overload;
end;

在这个类中存在一个名为Create的函数,就像构造函数一样,问题是,当我尝试创建TChid_Class的实例时,我遇到了访问冲突。

我编写了这个显示问题的小型控制台应用程序

program TestClass;

{$APPTYPE CONSOLE}

uses
Variants,
SysUtils;

type
TBaseClass=class
protected
constructor Create(LoadData:boolean;const Param1,Param2:string); overload;
public
Destructor Destroy; override;
end;

TChid_Class=class(TBaseClass)
function Create(const Param1, Param2 : String;const Param3 : OleVariant ; var Param4 : LongInt): Integer;overload;
constructor Create; overload;
constructor Create(LoadData:boolean); overload;
end;

{ TBaseClass }

constructor TBaseClass.Create(LoadData: boolean; const Param1, Param2: string);
begin
inherited Create;
Writeln('constructor TBaseClass.Create(LoadData: boolean; const Param1, Param2: string);');
end;

destructor TBaseClass.Destroy;
begin
//Code
inherited;
end;

{ TChid_Class }

function TChid_Class.Create(const Param1, Param2: String; const Param3: OleVariant; var Param4: Integer): Integer;
begin
Writeln('function create');
Result:=0;
end;

constructor TChid_Class.Create;
begin
Writeln('constructor TChid_Class.Create');
Create(True);
end;

constructor TChid_Class.Create(LoadData: boolean);
begin
Writeln('constructor TChid_Class.Create(LoadData: boolean)'); //here is the access violation
Create(LoadData,'Value 1','Value 2');
end;


var
Invoker : TChid_Class;
Pid : integer;
begin
try
Invoker:=TChid_Class.Create;
try
Invoker.Create('','',Unassigned,Pid)
finally
Invoker.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;

readln;
end.

如果我重命名函数 create,问题就会消失,但我正在寻找一种不重命名 create 函数或构造函数的解决方案。

使用delphi 2007

提前致谢。

最佳答案

使用 Delphi 7,我也得到了 AV。重命名该方法或移动它(按照 Sertac Akyuz 的建议)可以修复 AV。

我通过查看汇编程序发现了什么:

创建新对象时,在调用构造函数之前,会在寄存器dl 中放置一个非零值。

mov dl,$01              // dl set to 1
mov eax,[$00401268]
call TChild_Class.Create

然后在构造函数中的 begin 行,当 dl 不为零时调用 ClassCreate。

test dl,dl       
jz +$08 //if dl = 0 then do not call ClassCreate
add esp,-$10
call -$00000396 //calls ClassCreate

但是接下来就出错了,在你的代码中,编译器在调用 Create(True) 之前再次将 dl 设置为 1,所以在 begin 上code> 行 TChid_Class.Create(LoadData: boolean); 中,再次调用 ClassCreate,从而生成 AV。

重命名函数或移动其声明后,编译器会在调用 Create(正确)

我的猜测是,这是 Delphi 编译器中的一个错误,已在 Delphi 2010 及更高版本中修复。

关于delphi - delphi中名为create的函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4445745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com