对多态性了如指掌的大仙请进(长假期前是不许请假,不许迟到 ^-^),学生等你授课。

Hyphoon 2001-09-30 09:42:17
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TA = class
public
function ShowString: string; virtual; abstract;
end;

TAa = class(TA)
public
function ShowString: string; override;
end;

TAaa = class(TAa)
public
function ShowString: string; override;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
aa:TAa;
aaa:TAaa;
bb:TAa;
begin
aa:=TAa.Create;
aaa:=TAaa.Create;
Label1.Caption:=aa.ShowString;

bb:=TAa(aaa);
Label2.Caption:=bb.ClassName;
Label3.Caption:=bb.ShowString;

end;

{ TAb }

function TAaa.ShowString: string;
begin
inherited ShowString;
Result:='This is return by method of TAaa!';
end;

{ TAa }

function TAa.ShowString: string;
begin
Result:='This is return by method by TAa!';
end;

end.


以上代码运行后,你猜猜bb是哪个类的实例?没错,就是TAaa而不是预期中的TAa,为什么TAa(aaa)没有期作用,请大仙们授课。
(运行环境:Delphi5、Windows2000)
...全文
105 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chechy 2001-09-30
  • 打赏
  • 举报
回复
Label1: "This is return by method by TAa!";
Label2: "TAaa";
Label3: "'This is return by method by TAaa!";
enlightenment 2001-09-30
  • 打赏
  • 举报
回复

可以这样来理解(仅仅作为理解)

假设Ta被封装后的类入口结构为

_Ta=record
_ShowString:Pointer;//函数指针
end;

当创建aa实例时,将aa的方法对应的地址存入aa入口结构的指针中;

相应的,当创建aaa实例时,将aaa的方法对应的地址存入aaa的入口结构的指针中;

而对于bb,将aaa的实例指针引用并传递给bb时,只将对应方法的指针(aaa的对象指针)值传递给bb,所以引用出来的当然是aaa的方法了。
qiubolecn 2001-09-30
  • 打赏
  • 举报
回复
小指一下错误

你的create却没有free;

另外,
taa(aaa)不是没有作用,其实这就是多态性的一个特点,通过基类调子类
光明山人 2001-09-30
  • 打赏
  • 举报
回复
因为ShowString是虚拟方法啊,而你是用aaa(TAaa的实例)给bb赋的值,多态的意义就在于此。
MouseBrother 2001-09-30
  • 打赏
  • 举报
回复
把bb:=TAa(aaa);
改成 bb:= TAaa.Create 试一试

WhiteEat 2001-09-30
  • 打赏
  • 举报
回复
看一下C++有关虚函数的东东,原理一样的。

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧