program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;type
Thuman=class
public
procedure ShowInf;virtual;
end; TStudent=class (THuman)
public
procedure ShowInf;override;
end; TWorker=class (THuman)
public
procedure ShowInf;override;
end; procedure Thuman.ShowInf;
begin
Writeln('调用Thuman.ShowInf');
end; procedure TStudent.ShowInf; begin
Writeln('调用TStudent.ShowInf');
end; procedure TWorker.ShowInf;
begin
Writeln('调用TWorker.ShowInf');
end; var
S1:TStudent;
W1:TWorker;
H1:THuman;begin
H1:=THuman.Create;
H1.ShowInf;
H1.Destroy;H1:=TStudent.Create;
H1.ShowInf;
TWorker(H1).ShowInf; //这里问什么调用结果是:调用TStudent.ShowInf
H1.Destroy; //不是强制类型转换了吗?如果不是,那TWorker(H1)起什么作用?
//是不是在创建的时候决定的?H1:=TWorker.Create;
H1.ShowInf;
THuman(H1).ShowInf;
H1.Destroy;S1:=TStudent.Create;
S1.ShowInf;
TWorker(S1).ShowInf;
S1.Destroy;
end.
{$APPTYPE CONSOLE}
uses
SysUtils;type
Thuman=class
public
procedure ShowInf;virtual;
end; TStudent=class (THuman)
public
procedure ShowInf;override;
end; TWorker=class (THuman)
public
procedure ShowInf;override;
end; procedure Thuman.ShowInf;
begin
Writeln('调用Thuman.ShowInf');
end; procedure TStudent.ShowInf; begin
Writeln('调用TStudent.ShowInf');
end; procedure TWorker.ShowInf;
begin
Writeln('调用TWorker.ShowInf');
end; var
S1:TStudent;
W1:TWorker;
H1:THuman;begin
H1:=THuman.Create;
H1.ShowInf;
H1.Destroy;H1:=TStudent.Create;
H1.ShowInf;
TWorker(H1).ShowInf; //这里问什么调用结果是:调用TStudent.ShowInf
H1.Destroy; //不是强制类型转换了吗?如果不是,那TWorker(H1)起什么作用?
//是不是在创建的时候决定的?H1:=TWorker.Create;
H1.ShowInf;
THuman(H1).ShowInf;
H1.Destroy;S1:=TStudent.Create;
S1.ShowInf;
TWorker(S1).ShowInf;
S1.Destroy;
end.
解决方案 »
- 关于网卡的一些信息
- delphi 在windows application 状态下怎么输出啊?
- 难题求解:关于统计数据排序的问题
- 这样能开事务吗?
- 有谁贴出来TStringGrid的使用方法。怎么设置各个单元格的颜色等设置。
- excel输出,不同列要同时在一个表中输出的问题。
- 我的报表预览为什么总是位于其它其它窗口后面?如何让它位于其它窗口的上面?请教。
- 谁有STMP发邮件的范例代码,参考一下
- 求救,注册MsCommActivx,拿来使用时显示‘License information for TMSComm not found,you cannot use this contral in design’
- 急急,都问两次了,众大侠救兄弟一救!!?(关于bmp处理)
- 各位看官赐教了——adostoredproc控件的updatebatch功能怎么用?
- 询问:DELPHI和EJB通过SOAP传输
CWorker* pW = new CWorker();
CHuman* pH = (CHuman*)pW; //强制转换
pW->showinf();好像调用的还是CWorder的函数吧。
多态好像在C++中和Delphi中差不多吧。
但是这里:
H1:=TStudent.Create;
H1.ShowInf;
TWorker(H1).ShowInf;
这个“TWorker(H1).ShowInf; ”是个什么含义阿??
那位能说说???
TWorker(H1)是什么意识
但是在H1这个参数(和前面虚函数的)的影响下,动态编联到H1这个变量所对应的类的操作了。
而不是我先前考虑的“强制类型转换”。
应该是这样理解把?
但是在H1这个参数(和前面虚函数的)的影响下,动态编联到H1这个变量所对应的类的操作了。
而不是我先前考虑的“强制类型转换”。
应该是这样理解把?
//
type
Thuman=class
public
procedure ShowInf;virtual;
end;
//
procedure ShowInf;virtual;
会在运行期确定调用那个子类的ShowInf
----------------------------------------------------------------------------------
楼主请好好理解上面的话。
S1:TStudent;
W1:TWorker;
H1:THuman;H1:=TStudent.Create;
H1.ShowInf;
TWorker(H1).ShowInf; //这里问什么调用结果是:调用TStudent.ShowInf
H1.Destroy; //不是强制类型转换了吗?如果不是,那TWorker(H1)起什么作用?
//是不是在创建的时候决定的?我这么认为:虽然你声明的的是THUMAN 变量.后来也类型转换,但是实际上他是以TSTUDENT类创建的对象.实际上还是调用了TSTUDENT的方法.
着就是多态性的问题.楼上的几位说的都有道理.
强制类型转换仅仅是方便你的临时操作,绝对不会真正改变数据结构。
所以还是调用了TSTUDENT的方法.
另外,是动态编联。
H1.ShowInf;
H1.Destroy;H1:=TStudent.Create;//动态编联,已经确定了是TStudent,强制类型转换也没用了!
H1.ShowInf;
TWorker(H1).ShowInf; //强制类型转换
H1.Destroy;