更正以下:
TChild=class(TBase)
  public
    public Test;//override;
  end;
应该是:
TChild=class(TBase)
  public
    procedure Test;//override;
  end;

解决方案 »

  1.   

    <1>是的,无论有没有override,都显示'TChild',有两个原因:(a)因为你调用的是TChild.Test;(b)实例是TChild,ClassName也会返回"TChild"的,不管变量的类型是什么。改成下面的代码就会知道不同了:procedure TBase.Test;
    begin
      showmessage('TBase');
    end;
    procedure TChild.Test;
    begin
      //inherited;
      showmessage('TChild');
    end;procedure TestOverride;
    var
      Base, Child: TBase; // 变量类型是TBase
    begin
      Base := TBase.Create;
      Base.Test;
      Base.Free;
      Child := TChild.Create; // 这里创建的实际是TChild对象,尽管变量类型是TBase
      Child.Test;
      Child.Free;
    end;
      

  2.   

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TBase=class(TObject)
      public
        procedure Test;//virtual;
      end;
      TChild=class(TBase)
      public
        procedure Test;//override;
      end;var
      Form1: TForm1;
      tbase1:tbase;
      tchild1:tchild;implementation{$R *.DFM}
    procedure TBase.Test;
    begin
      showmessage(self.ClassName);
    end;
    procedure TChild.Test;
    begin
      //inherited;
      showmessage(self.ClassName);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      tbase1:=tbase.Create;
      tbase1.test;
      tchild1:=tchild.create;
      tchild1.test;
    end;
    第一个问题,没有问题,关键在于你生成时,是用什么类的create,是什么类就会显示什么,所以不会出现你说的两次一样的问题。
    第二个问题,也没有问题,关键在于你继承后,你生成的类还是tchild,用tchild类打印类名,当然是打印tchild了。类名又没有继承下来。
    第三个问题,要打印父类的类名,可以用
    showmessage(self.classparent.className);
      

  3.   

    ahuige(灰不遛秋) ,哪个?把url贴出来,我不知道是我忘了,还是我还没有得到满意的解答!
      

  4.   

    就是http://www.csdn.net/expert/topic/592/592049.xml?temp=.2104456
    你自称我的方法效率不高,但是也没人能找出效率更高的了,呵呵。