unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TClassA = class
function Text:Integer;dynamic;
end; TClassB = class(TClassA)
function Text:Integer;override;
end; TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
aa:TClassB;
begin
aa:= TClassB.Create;
showmessage(IntToStr(aa.Text));
aa.Free;
end;{ TClassA }function TClassA.Text: Integer;
begin
Result:= 1;
end;{ TClassB }function TClassB.Text: Integer;
begin
Result:= TClassA(Self).Text;
end;end.运行出现“Stack OverFlow”,各位帮帮忙好吗?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TClassA = class
function Text:Integer;dynamic;
end; TClassB = class(TClassA)
function Text:Integer;override;
end; TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
aa:TClassB;
begin
aa:= TClassB.Create;
showmessage(IntToStr(aa.Text));
aa.Free;
end;{ TClassA }function TClassA.Text: Integer;
begin
Result:= 1;
end;{ TClassB }function TClassB.Text: Integer;
begin
Result:= TClassA(Self).Text;
end;end.运行出现“Stack OverFlow”,各位帮帮忙好吗?
begin
Result:= TClassA(Self).Text; //这儿有问题。改为:Result:=2;看看可以吗!
end;
我给你解释一下,
你的实现代码是
Result :=TClassA(Self).Text
是想把Self强制转换为TClassA,但是造成的结果是不停的调用这一句代码,因为Self.Text就是直接调用TClassB.Text这个函数。也就是等价于
result :=TClassB.Text;这样不停的调用,肯定会造成堆溢出的
去掉这个dynamic;呢?
我给你解释一下,
你的实现代码是
Result :=TClassA(Self).Text
是想把Self强制转换为TClassA,但是造成的结果是不停的调用这一句代码,因为Self.Text就是直接调用TClassB.Text这个函数。也就是等价于
result :=TClassB.Text;这样不停的调用,肯定会造成堆溢出的
我给你解释一下,
你的实现代码是
Result :=TClassA(Self).Text
是想把Self强制转换为TClassA,但是造成的结果是不停的调用这一句代码,因为Self.Text就是直接调用TClassB.Text这个函数。也就是等价于
result :=TClassB.Text;这样不停的调用,肯定会造成堆溢出的
2 去掉CLassB中的override
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TClassA = class
public
function Text:Integer;dynamic;
end; TClassB = class(TClassA)
private
ClassA :TClassA;
public
function Text:Integer;override;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
aa:TClassB;
begin
aa:= TClassB.Create;
showmessage(IntToStr(aa.Text));
aa.Free;
end;{ TClassA }function TClassA.Text: Integer;
begin
Result:= 1;
end;{ TClassB }function TClassB.Text: Integer;
begin
ClassA :=TClassA.Create ;
Result:= ClassA.Text;
end;end.
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TClassA = class
function Text:Integer;dynamic;
end; TClassB = class(TClassA)
function Text:Integer;override;
end; TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
aa: TClassB;
begin
aa := TClassB.Create;
ShowMessage(IntToStr(aa.Text));
aa.Free;
end;{ TClassA }function TClassA.Text: Integer;
begin
Result:= 1;
end;{ TClassB }function TClassB.Text: Integer;
var
bb: TClassA;
begin
bb := TClassA.Create;
Result:= bb.Text;
bb.Free;
end;end.