关于对象的概念性问题
首先看看以下程序,
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
THuman = class // 人类
procedure ShowInf; virtual;
end;
TStudent = class(THuman) // 学生类
procedure ShowInf;override;
end;
TWorker = class(THuman) // 工人类
procedure ShowInf;override;
procedure ShowInfo;
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;
procedure TWorker.ShowInfo;
begin
Writeln('调用TWorker.ShowInfo');
end;
var
H1 : THuman;
S1 : TStudent;
begin
H1 := THuman.Create;
H1.ShowInf;
H1.Destroy;
H1 := TStudent.Create;
H1.ShowInf;
TWorker(H1).ShowInfo; //这句居然真的调用了TWorker的ShowInfo方法
H1.Destroy;
H1 := TWorker.Create;
H1.ShowInf;
THuman(H1).ShowInf;
H1.Destroy;
S1 := TStudent.Create;
S1.ShowInf;
TWorker(S1).ShowInf;
S1.Destroy;
end.
本来是和别人讨论动态绑定的时候写的一个例子,但是程序中加注释的这句的表现让我大吃一惊,不同的子类之间居然可以合法的强制类型转换而不在运行时出错,而且还堂而皇之的调用了其他子类的方法,Why。