关于面向对象多态的问题?

彩练当空 2011-11-08 09:37:41
type
TFigure=class
procedure Draw;
end;
TRectangle=class(TFigure)
procedure Draw;
end;
var
Figure:TFigure;
Rectangle:TRectangle;
begin
Figure:=TFigure.create;
Figure.Draw; //调用的是TFigure.Draw;
Figure.Destroy;
Figure:=TRectangle.create;
Figure.Draw; //调用的是TFigure.Draw,为什么?;
TRectangle(Figure).Draw; //调用的是TRectangle.Draw
Figure.Destroy;
Rectangle:=Trectangle.Create; //调用的是TRectangle.Draw
Rectangle.Draw;
Rectangle.Destroy;

...全文
88 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhy 2011-11-09
  • 打赏
  • 举报
回复
这个问题主要涉及delphi的对象模型,对象模型弄通了,这类问题就都通了。
火龙岛主 2011-11-09
  • 打赏
  • 举报
回复
Figure.Draw; //调用的是TFigure.Draw,为什么?;
因为Figure是TFigure类型的,所以调用的是TFigure的方法。
如果你这样写,就是子类的了。如下向下转型的方法。
TRectangle(Figure).Draw;
cqs6616 2011-11-08
  • 打赏
  • 举报
回复
TFigure=class
procedure Draw;virtual;
end;
TRectangle=class(TFigure)
procedure Draw;override;
end;
rainychan2009 2011-11-08
  • 打赏
  • 举报
回复
LZ,你那叫改写。
funxu 2011-11-08
  • 打赏
  • 举报
回复
1L精辟,LZ看下override的资料吧
lhy 2011-11-08
  • 打赏
  • 举报
回复
定义函数时没有表明虚拟和重载。
shijies 2011-11-08
  • 打赏
  • 举报
回复
Figure:=TRectangle.create;
Figure.Draw; //调用的是TFigure.Draw,为什么?;
Figure为TFigure类型,多态是楼上形式的,还分为类有继承关系的和没有继承关系的两种。

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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