马金鑫的个人空间 https://blog.eetop.cn/1095590 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

关于cast向下兼容的问题

已有 1158 次阅读| 2017-7-24 19:45 |系统分类:硬件设计

$cast可以对不同的内建类型进行转换,用的更多的是不同层次之间类的转换。在这种父类于子类之间的转换里, 父类站的高,子类在底下,从父类向子类的转换,称为向下类型转换,而子类向父类的转换称为向上类型转换。向上类型转换是安全的,而反之则是不安全的。原因在于子类既然继承了父类,就拥有父类的一切属性,除此之外,子类还有自己独特的个性,这些是父类没有的。当进行向上类型转换时,相当于父类的句柄指向子类对象,这样的话句柄仍然能对子类对象与父类相同的属性进行访问。但是反过来,如果向下类型转换也那么自由,当试图把子类的句柄指向父类的对象会发生什么呢?父类本来在内存里就划好了一小块地盘,但是因为子类含有比父类更丰富的属性,它很有可能会访问父类并不包含的资源,越界了。

下面以一个例子进行说明。
对于两个具有继承关系的class,若对应父类的instance为father_tr,而子类的instance为child_tr,那么​如果只是让子类的指针指向父类,有以下几种操作方法:
1、简单赋值:fathrer_tr = child_tr;​
2、使用copy函数:father_tr = child_tr.copy();
3、使用$cast函数:$cast(father_tr, child_tr);​
以上3种方法均可实现数据的传递,但有本质区别:(1)通过简单赋值操作,使两个handle father_tr和child_tr指向了同一块memory,因此,father_tr的类型也会变成子类的类型。(2)使用copy函数​,是将数值进行简单的copy,即将child_tr对应的memory中的数据放入father_tr对应的memory中,这种数据的copy方式,不会带来类型的变化,因此,father_tr仍然是父类的类型,但使用copy函数要求father_tr得先new一块memory, 如果没有memory,则需要使用clone函数。(3)此处的$cast操作与(1)中的简单赋值很类似,father_tr的类型也会变为子类的类型。
上面子类向父类进行数据传递时,显示不出$cast操作向下类型转换的优势,但父类向子类传递数据时,无法使用child_tr = father_tr,则必须要使用$cast操作。
使用$cast操作,直接使用$cast(child_tr, father_tr)是非法的,此时则要求基类的handle必须指向派生类的对象,即father_tr必须指向child_tr类型的对象​,因此一般会有如下几步操作:
1、定义一个派生类类型的对象:child1_tr = new;
2、​father_tr = child1_tr;
3、$cast(child_tr, father_tr);

以上第(3)步,$cast会做类型检查,若类型兼容返回1,否则返回0。


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 1

    评论
  • 1094

    访问数
关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-26 16:27 , Processed in 0.022560 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部