H
huaervvhuaer
Unregistered / Unconfirmed
GUEST, unregistred user!
请看代码
Tshape=class
public
ai:integer;
procedure draw();
end;
Tline=class(Tshape)
public
bi:integer;
bs:string;
bp:Tpoint;
procedure draw();overload;
end;
var
line:Tline;
begin
line:=Tline(Tshape.create);//1.只是转换了对象引用的类型??
line.bp:=point(2,3)
//2.ok,为什么?但下一条语句出错
line.bs:='aaaaaaaaaa'
//3.运行时出错,为什么?
line.draw();//4.调用的是派生类的对象的draw(),为什么?
end;
请回答上面四个问题。
*********************************************************
另外把例子稍做修改:
Tshape=class
public
ai:integer;
procedure draw()
virtual;
end;
TLine=class(Tshape)
public
bp:Tpoint;
str:string;
procedure draw()
override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
line,line2:TLine;
begin
line:=TLine(Tshape.Create);
//转换的只是对象的引用的类型,从下面的测试结果可以得出实际的对象还是Tshape对象
line2:=TLine.Create;
showmessage('inst size:'+inttostr(line.InstanceSize)+':'+inttostr(line2.InstanceSize));
//但是--> 问题2. 下面又如何解释?
Line.bp:=point(2,3);
line.ai:=999;
showmessage(format('line.bp:%d,%d: line.ai is %d',[Line.bp.X,Line.bp.y,line.ai]));
// 输出的是line.bp:2,3 line ai is 999
// 说明ai,bp并不是占用相同的内存空间,这样的话与上面的自相矛盾呀!!!
//问题3, 下面的在delphi7中运行的时候会出错,但在delphi 6中正常!为什么?
//有兴趣的朋友可以分别在delphi 7和delphi 6中试试
line.str:='drived class string';
showmessage(line.str);
//新发现,用派生类的指针/引用指向基类的对象,同样可以实现多态!!!
line.draw;
//输出结果是invoked Tshape.draw(),即调用的基类Tshape的方法。
end;
{ Tshape }
procedure Tshape.draw;
begin
showmessage('invoked Tshape.draw()');
end;
{ TLine }
procedure TLine.draw;
begin
showmessage('invoked TLine.draw()');
end;
Tshape=class
public
ai:integer;
procedure draw();
end;
Tline=class(Tshape)
public
bi:integer;
bs:string;
bp:Tpoint;
procedure draw();overload;
end;
var
line:Tline;
begin
line:=Tline(Tshape.create);//1.只是转换了对象引用的类型??
line.bp:=point(2,3)
//2.ok,为什么?但下一条语句出错
line.bs:='aaaaaaaaaa'
//3.运行时出错,为什么?
line.draw();//4.调用的是派生类的对象的draw(),为什么?
end;
请回答上面四个问题。
*********************************************************
另外把例子稍做修改:
Tshape=class
public
ai:integer;
procedure draw()
virtual;
end;
TLine=class(Tshape)
public
bp:Tpoint;
str:string;
procedure draw()
override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
line,line2:TLine;
begin
line:=TLine(Tshape.Create);
//转换的只是对象的引用的类型,从下面的测试结果可以得出实际的对象还是Tshape对象
line2:=TLine.Create;
showmessage('inst size:'+inttostr(line.InstanceSize)+':'+inttostr(line2.InstanceSize));
//但是--> 问题2. 下面又如何解释?
Line.bp:=point(2,3);
line.ai:=999;
showmessage(format('line.bp:%d,%d: line.ai is %d',[Line.bp.X,Line.bp.y,line.ai]));
// 输出的是line.bp:2,3 line ai is 999
// 说明ai,bp并不是占用相同的内存空间,这样的话与上面的自相矛盾呀!!!
//问题3, 下面的在delphi7中运行的时候会出错,但在delphi 6中正常!为什么?
//有兴趣的朋友可以分别在delphi 7和delphi 6中试试
line.str:='drived class string';
showmessage(line.str);
//新发现,用派生类的指针/引用指向基类的对象,同样可以实现多态!!!
line.draw;
//输出结果是invoked Tshape.draw(),即调用的基类Tshape的方法。
end;
{ Tshape }
procedure Tshape.draw;
begin
showmessage('invoked Tshape.draw()');
end;
{ TLine }
procedure TLine.draw;
begin
showmessage('invoked TLine.draw()');
end;