更正以下:
TChild=class(TBase)
public
public Test;//override;
end;
应该是:
TChild=class(TBase)
public
procedure Test;//override;
end;
TChild=class(TBase)
public
public Test;//override;
end;
应该是:
TChild=class(TBase)
public
procedure Test;//override;
end;
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;
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);
你自称我的方法效率不高,但是也没人能找出效率更高的了,呵呵。