关于Delphi向上映射兼容性的问题!请高手一定指教!分不够再加!!

tiancanshi 2003-03-09 03:02:19
delphi关于对象指针赋值或者强制类型转换的时候,经常会涉及到类型是否兼容的问题。
对此,本人比较迷惑。
究竟什么才叫类型兼容??不用向我解释说子类和祖先类之间或者什么之间是兼容的。
这些书上都有!我现在只想知道,在发生上述情况的时候(对象指针赋值或者强制类型转换),编译器要具体要检测什么??怎么检测?什么是合法的,什么是非法的,编译器检测的标准是什么?最好能具体点。

这几天对以下几条语句很是费解:
//ACLASS是已定义的一个类;BCLASS是ACLASS的子类
//BCLASS=CLASS(ACLASS)

var
Ao :ACLASS; //这个时候编译器究竟做了哪些工作(具体的说)?
Bo :BCLASS 不仅仅是分配一个个四字节的指针空间吧?肯定要
附加一些和类ACLASS有关的信息为后面的工作做准备?
或者作为检测的标准??是什么??
···············

AO:=BCLASS.create; //正确!这个时候AO的确指向了一个内存的对象空间;这
个空间的大小和BCLASS的instancesize一样大,但却只能访
ACLASS的成员?为什么?
如果是:
BO:=ACLASS.create; //类型不兼容错误!但兼容标准是什么(编译器怎么认为的)???

再如果
AO:=ACLASS.CREATE;
BO:=B(AO); //正确!但 在执行B()的时候,编译器究竟又做了什么(具体)?

它是怎么解释这句话的??此时B0所指对象空间和AO的一般大?

真心希望高手能把这些底层的实现给我们讲讲?在此非常感谢!!
...全文
31 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjybestzjybest 2003-03-10
  • 打赏
  • 举报
回复
比如:
type
aclass=class
i:integer;
end;
bclass=class(aclass)
j:integer;
end;
var
ao :aclass;
bo:bclass
begin
BO:=ACLASS.create;//错误,编译器担心你用B0访问BCLASS有而ACLASS里没有的成员。
//因为ACLASS里面没有成员J,所以访问BO.J会有问题
AO:=BCLASS.create;//正确,通过A0能访问到的成员全部属于BCLASS,赋值是安全的。
//因为AO是ACLASS类型所以他只能访问ACLASS.I,不会访问子类的J。
BO:=BCLASS(AO);//既然你做了强制类型转换,编译器就不对安全性做判断。
//注意虽然转换了但是你还是不能访问BO.J因为他在ACLASS里面没有定义。如果访问
//会有异常
end;

tiancanshi 2003-03-10
  • 打赏
  • 举报
回复
说的好象不是我非常想知道的东西!
深宇 2003-03-09
  • 打赏
  • 举报
回复
楼上说的没错,这样的转换有时非常有用的。
ly_liuyang 2003-03-09
  • 打赏
  • 举报
回复
类型转换最好用RTTI的as指令,
is是类型判别指令

这种格式最好
Xtype和YType要可以兼容的
if a is XType then b:=a as YType
ahjoe 2003-03-09
  • 打赏
  • 举报
回复
BO:=ACLASS.create;//错误,编译器担心你用B0访问BCLASS有而ACLASS里没有的成员。
AO:=BCLASS.create;//正确,通过A0能访问到的成员全部属于BCLASS,赋值是安全的。
BO:=B(AO);//既然你做了强制类型转换,编译器就不对安全性做判断。
B0:=BCLASS(0);//正确,既然你做了强制类型转换,你自己负责啦。
蝈蝈太阳 2003-03-09
  • 打赏
  • 举报
回复
gz
tiancanshi 2003-03-09
  • 打赏
  • 举报
回复
没关系,大家就当是讨论问题吧。总这样憋着也不是个办法!
MyCrooner 2003-03-09
  • 打赏
  • 举报
回复
关注, 怕理解不好,说出来误了人

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧