派生类隐式转换成基类的问题
在值类型转换时,以下代码是成立的:
int i=10;
double d=i;
i到double的类型转换是隐式的,没有数据损失。
而在引用类型转换时:
class MyDerived:MyBase
{
}
MyDerived a=new Myderived();
MyBase b=a;
以上代码是由派生类a隐式转换成基类b,a派生类上一些额外信息就掉失了,为何以上代码隐式转换还是成立的?
------解决方案--------------------向上转型是成立的,隐式转型后类的信息会丢失吗?测试过没?
------解决方案--------------------你可以认为这是另一种类型的隐式类型转换,不能用上面的逻辑来解释,再说,这样的类型转换中,数据没有任何的丢失,仅仅是变量的类型变换了,一些功能被隐藏了,你直接GetType就能看到这个对象原来的类型。
------解决方案--------------------分别称为扩大转换和向上转换。
------解决方案--------------------MyBase b=a;
这不叫转换
------解决方案--------------------MyDerived a=new Myderived();
MyBase b=a;
这其实不是隐式类型转换,其实是引用。也就是说基类对象a引用了继承类b的对象,他们指向同一个在堆中的对象。但是由于a的类型是基类MyBase,因此它只能调用本类中的成员函数和成员变量。因此这个可以看成是“类型转换”,但有一点不同的是,普通的类型转换其中有一个temp对象,各个对象指向不同的内存地址,而这个指向同一个对象,指向同一个内存地址。