举例
假设有A,B,C三个类,继承关系如下:A <= B <= C
即,A是基类,派生出B,B派生出C.
列举如下几种,强转情况:
- 实例化A,无法将其强转为B和C
- 实例化B,可以将其强转为A,也可以强转回为B,但是无法将其强转为C
- 实例化C,可以将其强转为A,也可以强转为B,还可以强转回为C
原理
类型的强转,从本质上来讲,是划定指针访问的有效范围。强转失败,意味着可能发生了指针越界访问。
比如实例化B, 就可以访问B的属性和方法,将其强转为A后,就只能访问A映射到B上的属性和方法了(指针范围缩小);但是B无法强转为C(指针访问越界),因为在最初实例化B中并没有C的任何属性和方法。
这里隐含一个著名的原则,
里氏替换原则:子类型必须能够替换掉他们的父类型。
也可以使用另外一种更形象的说法,叫做“向上造型”。类型的转换叫“造型”。“向上造型”就是说,我们只能把子类转换为父类,即向上(可以想象一下类继承的UML图)转换。
总结
- 实例化的子类型可以强转为父类型,但是实例化的父类型无法强转为子类型。
- 如果你发现父类型可以强转为子类型,这说明这个父类型并不是实例化得到的,而是由子类型强转过来的。