救命啊!高手!(100分)

  • 主题发起人 主题发起人 webworm
  • 开始时间 开始时间
W

webworm

Unregistered / Unconfirmed
GUEST, unregistred user!
子类的对象引用可以付给父类的变量,我书上看到过,至于为什么,我也没有研究过,但是,我觉得既然创建对象是子类创建的,也就是说是子类分配内存块的(你不要晕,因为对象就是一块内存块啊)那么为什么在myobject.value时候会是integer类型,而不是在子类中重新声名的string型呢?
请看下面例子:

type
TAncestor = Class
value :integer

end


type
TDescendant = class(TAncestor)
value:integer

end


var
myobject:tAncestor

begin
代码:
myobject:=TDescendant.create

myobject.value:='hello' //error!
TDescendant(myobject).value:='hello' //works!
end

为什么myobject.value是integer类型的,按我的理解是Create之后创建的内存块中的信息应该是string型的!
 
myobject是TDescendant创建的对象,
那他的value当然是integer的啦,
 
1、你的代码中没声明为STRING类型
2、子类可以增加属性变量等,但不能对父类属性和方法等修改
 
myobject.value和TDescendant(myobject).value根本就不是一回事情,
你跟踪调试一下就知道了它们的内存地址都不一样,TDescendant的value 把
TAncestor的value隐藏、替代了.
 
to:lanbing1400
不好意思,我在子类中声明的value应该是这样的value:string是我写错了!能在看看吗?
 
静态成员编译时根据变量类型绑定。
myobject的类型为 tAncestor

TDescendant(myobject)的类型为 TDescendant
 
静态成员编译时根据变量类型绑定。
这个我知道了,
我现在的理解是这样的,
TDescendant创建时给父类以及他自己的成员分配了内存,
然后当myobject:=myobject1的时候把myobject1中从tAncestor继承下来的成员赋
给myobject。至于为什么会这样,我就搞不懂了!
估计是编译器的工作了!(myobject:TAncestor myobject1:TDescendant)
 
多人接受答案了。
 
后退
顶部