用子类创建的对象为何我无法使用其属性和方法?(20分)

  • 主题发起人 主题发起人 ly537zp
  • 开始时间 开始时间
L

ly537zp

Unregistered / Unconfirmed
GUEST, unregistred user!
uses
SysUtils;

type
Tperson=class
public
name:string;
age:integer;
end;
Temployee=class(Tperson)
public
address:string;
procedure infor;
end;
{ Temployee }

procedure Temployee.infor;
begin
writeln('姓名:',name,' 年龄:',age,' 地址:',address);
end;
var
P:Tperson;
begin
{ TODO -oUser -cConsole Main : Insert code here }
P:=Tperson.Create ;
P.name:='李红';
P.age:=21;
p.Free ;
p:=Temployee.Create ;//创建子类Temployee对象
p.name:='王环';
p.age:=22;
p.address:='珠江路'; //出错
p.infor; //出错
p.Free ;
readln;
end.
各位指导指导,为什么我创建了子类Temployee对象p却不能直接使用它的属性address和方法infor???我看到书上在使用时用了Temployee(p).address,能给我解答一下吗?我是初学,谢谢!


 
没人能给我个答案吗?拜托!!!
 
Temployee(p).address:='珠江路'; //出错
Temployee(p).infor; //出错
 
Temployee(p)是强制类转换。
你的问题我还是第一次碰到,如果是在类内使用,就不会出现这样的问题,估计的编译器约定的规则是这样。
 
lichengbin,我是想问为什么要这样写呀?
 
xuxiaohan,什么是在类内使用,能就依我的代码给个例子,谢谢!
 
因为你的p是定义为Tperson,所以虽然创建的是Temployee的实例,但需要强制转换
取得Temployee的字段值和执行Temployee的方法
 
我用 p is Temployee 测试返回的值是true呀!既然p 是Temployee类型的,怎么还需要用强制类型转换???
 
噢,是我搞错了,
类内类外都可以的;
原因:
如果定义为Tperson, 那不管你用什么子类创建,P 的类型还的 TPerson, Tperson没有address成员,当然出错啦!

你的定义 P:Temployee; 就不用 强制类转换啦;


 
不错,p是Temployee,但这是你在运行时测试的结果,而编译器只知道你定义的p
是Tperson类型的,所以当然要强制转换了,否则编译无法通过的
 
谢谢!lichengbin,xuxiaohan,再次感谢!
 
后退
顶部