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.
解决方案 »
- 一个看似简单的问题,居然查不到答案!
- ADOConnection动态连接问题
- 请教高手,如何监测到数据库中是哪条记录被修改了.
- 我想问一下,DELPHI的DBEXPRESS使用的是ADO技术还是BDE还是别的?软件发布需要转别的什么组件么?
- 菜鸟遇到很难的问题,翻了好多书都没找到希望高手进来帮忙.重谢
- 如何控制在Edit控件中只能输入数字且小数点后最多两位(急!在线等)
- 计算的问题。
- 救命:一个大循环中出错中断,循环因子值被改变,怎样才能知道循环到哪里出错?
- 给个例子好嘛?(一个最初级的问题)
- 超级难题,怎样修改FLASH的右键弹出菜单?
- 各位看官赐教了——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;