关于面向对象 “类型强转” 的个人理解

举例

假设有A,B,C三个类,继承关系如下:A <= B <= C
即,A是基类,派生出B,B派生出C.

列举如下几种,强转情况:

  1. 实例化A,无法将其强转为B和C
  2. 实例化B,可以将其强转为A,也可以强转回为B,但是无法将其强转为C
  3. 实例化C,可以将其强转为A,也可以强转为B,还可以强转回为C

原理

类型的强转,从本质上来讲,是划定指针访问的有效范围。强转失败,意味着可能发生了指针越界访问
比如实例化B, 就可以访问B的属性和方法,将其强转为A后,就只能访问A映射到B上的属性和方法了(指针范围缩小);但是B无法强转为C(指针访问越界),因为在最初实例化B中并没有C的任何属性和方法。

这里隐含一个著名的原则,
里氏替换原则:子类型必须能够替换掉他们的父类型

也可以使用另外一种更形象的说法,叫做“向上造型”。类型的转换叫“造型”。“向上造型”就是说,我们只能把子类转换为父类,即向上(可以想象一下类继承的UML图)转换。

总结

  1. 实例化的子类型可以强转为父类型,但是实例化的父类型无法强转为子类型。
  2. 如果你发现父类型可以强转为子类型,这说明这个父类型并不是实例化得到的,而是由子类型强转过来的。
发布了8 篇原创文章 · 获赞 0 · 访问量 261

猜你喜欢

转载自blog.csdn.net/wangyahua1234/article/details/103138597