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”,各位帮帮忙好吗?

解决方案 »

  1.   

    function TClassB.Text: Integer;
    begin
      Result:= TClassA(Self).Text; //这儿有问题。改为:Result:=2;看看可以吗!
    end;
      

  2.   

    TClassB.Text已经覆盖了TClassA.Text的方法,怎么还可以调用呢?
      

  3.   

    你的function TClassB.Text :Integer形成了一个递归调用了
    我给你解释一下,
    你的实现代码是
    Result :=TClassA(Self).Text
    是想把Self强制转换为TClassA,但是造成的结果是不停的调用这一句代码,因为Self.Text就是直接调用TClassB.Text这个函数。也就是等价于
    result :=TClassB.Text;这样不停的调用,肯定会造成堆溢出的
      

  4.   

    function Text:Integer;
    去掉这个dynamic;呢?
      

  5.   

    你的function TClassB.Text :Integer形成了一个递归调用了
    我给你解释一下,
    你的实现代码是
    Result :=TClassA(Self).Text
    是想把Self强制转换为TClassA,但是造成的结果是不停的调用这一句代码,因为Self.Text就是直接调用TClassB.Text这个函数。也就是等价于
    result :=TClassB.Text;这样不停的调用,肯定会造成堆溢出的
      

  6.   

    你的function TClassB.Text :Integer形成了一个递归调用了
    我给你解释一下,
    你的实现代码是
    Result :=TClassA(Self).Text
    是想把Self强制转换为TClassA,但是造成的结果是不停的调用这一句代码,因为Self.Text就是直接调用TClassB.Text这个函数。也就是等价于
    result :=TClassB.Text;这样不停的调用,肯定会造成堆溢出的
      

  7.   

    1 TClassA(Self).Text调用的还是ClassB的Text,造成了死循环
    2 去掉CLassB中的override
      

  8.   

    解决方法
    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.
      

  9.   

    unit Unit1;interfaceuses
      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.