简单的理解:
1、可以将一个派生类隐式的赋值给其基类
2、无法将一个基类强制转换为其派生类,但一种情况例外,如果基类是由目标派生类或者目标派生类的派生类(即子类的子类)实现的,则可以强制的将这个基类转换为对应的派生类。
例如:对于MyBMWCar类继承至 MyCar类,MyCar类继承至MyObject类
a、将一个派生类隐式的赋值给其基类
MyBMWCar bmwCar = new MyBMWCar();
MyCar car = bmwCar;
MyObject obj = car; //或者MyObject obj = bmwCar;
b、无法将一个基类强制转换为其派生类
MyObject obj = new MyObject();
MyCar car = (MyCar)obj;//无法实现
MyBMWCar bmwCar = (bmwCar)obj;//无法实现
例外 :基类是由目标派生类或者目标派生类的派生类(即子类的子类)实现的
MyObject obj = new MyCar();
MyCar car = (MyCar)obj;//可以实现
//但是,以下情况是不可以的
MyBMWCar bmwCar = (bmwCar)obj;//无法实现,这句话等同于MyBMWCar bmwCar = (bmwCar)car;已经说了无法将一个基类强制转换为派生类
或者
MyObject obj = new MyBMWCar();
MyCar car = (MyCar)obj;//可以实现
MyBMWCar bmwCar = (bmwCar)obj;//可以实现,这句话等同于MyBMWCar bmwCar = (bmwCar)car;
为什么?
在上面b例子中,看似将基类强制转换成了派生类,但实质是基类obj指向的是一个派生类对象,例如我们把b的第二个例子这样看也许就明白了,我们将MyObject obj = new MyCar();这句代码换种方式表达:
MyCar carobj = new MyCar();
MyObject obj = carobj;//将一个派生类赋值给基类
MyCar car = (MyCar)obj;//同级强制转换可以实现,但这其实是多余的操作
//但是,以下情况还是不可以的
MyBMWCar bmwCar = (bmwCar)obj;//无法实现,这句话等同于MyBMWCar bmwCar = (bmwCar)car;已经说了无法将一个基类强制转换为派生类