引用类型转换:派生类为什么可以隐式的转换成基类??

ibinggo 2009-02-06 10:44:13
派生类为什么可以隐式的转换成基类??
派生类是基类的继承,既然是继承,那么派生类的取值范围就比基类大,取值范围大应该显示转换啊?
不解!!
...全文
512 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ketet 2009-08-21
  • 打赏
  • 举报
回复
这个不就是一般与特殊的关系问题嘛。一般是包含于特殊之中的。基类就是这里的一般,而派生类就是特殊。所以比如车和火车为例,把车看成基类,火车看成派生类。火车显然是车,所以火车具有车的属性和方法,可以直接转换成基类。而车不一定是火车,所以不能将车直接转换成火车,必须显示地进行cast。
manbufenglin 2009-02-08
  • 打赏
  • 举报
回复
孩子的事情,可以有父母代劳!!!!
CsToD 2009-02-07
  • 打赏
  • 举报
回复
这是很明显的道理嘛!
比如:
class Father
{
public void A();
}
class Sun:Father
{
public void B();
}
显然,Sun类是不是有A,B两个方法?而Father只有A方法
Father f=new Father();//只能在其上调用A方法,而不能调用B方法,因为Father根本没定义B方法
如果按你的逻辑,父类到子类的转换是合法的,那么:
Sun s=f;或者Sun s=new Father();
从形式上说,你可以在s上调用B方法,但实际上s引用的是new Father(),怎么可能调用B方法?根本就没定义!


而反过来就不会出现任何问题:
Sun s=new Sun();//可以在s上调用A,B方法
Father f=s;或者Father f=new Sun();//从形式上就只能调用A方法,虽然引用的对象是Sun,但是不能调用,

这只不过是“大材小用”,而不是刚才那种“无中生有”!


相信楼主应该明白了吧?
vrhero 2009-02-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 csc_hanker 的回复:]
引用楼主 ibinggo 的帖子:
派生类为什么可以隐式的转换成基类??
派生类是基类的继承,既然是继承,那么派生类的取值范围就比基类大,取值范围大应该显示转换啊?
不解!!


不知道楼主是不是指的是派生类对象赋值给基类对象的情况,2楼说的对,这种情况和数据类型转换并不一样,这并不是值类型和引用类型的转换,不存在赋值取值装箱拆箱问题,派生类隐式转换成基类只是指针类型的转变,内存布局是不变的,所以就不存…
[/Quote]
补充一点...类必然是引用类型,不可能存在值类型和引用类型的转换...而值类型是不可能有派生继承的...
vrhero 2009-02-07
  • 打赏
  • 举报
回复
派生类添加的基类没有的成员对于基类来说都是不需要的...和什么取值范围、引用类型还是值类型、装箱拆箱统统没有关系...
vrhero 2009-02-07
  • 打赏
  • 举报
回复
类不是简单的数据结构,不要去纠缠于什么变量、取值范围,要用OO的思维去看它...

其实很简单...狼狗必定是狗,狗必定不止是狼狗...所以你可以直接把狼狗叫做狗但你要把吉娃娃叫做狼狗就会被人嘲笑...

因为派生类必然具有基类的所有成员所以派生类可以毫无疑问地转换为基类...反过来基类因为可能(注意仅仅是可能)不包含派生类的成员所以不能直接转换...就算派生类和基类完全一样没有增加新成员但是你知道编译器不知道...
csc_hanker 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 ibinggo 的帖子:]
派生类为什么可以隐式的转换成基类??
派生类是基类的继承,既然是继承,那么派生类的取值范围就比基类大,取值范围大应该显示转换啊?
不解!!
[/Quote]

不知道楼主是不是指的是派生类对象赋值给基类对象的情况,2楼说的对,这种情况和数据类型转换并不一样,这并不是值类型和引用类型的转换,不存在赋值取值装箱拆箱问题,派生类隐式转换成基类只是指针类型的转变,内存布局是不变的,所以就不存在范围大装不下信息丢失的问题了
ibinggo 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vwxyzh 的回复:]
引用楼主 ibinggo 的帖子:
派生类是基类的继承,既然是继承,那么派生类的取值范围就比基类大,取值范围大应该显示转换啊?

lz理解错了
派生类是基类的继承,既然是继承,那么派生类就更具体,既然更具体,那么符合派生类的情况就更少,所以取值范围就更小
[/Quote]
派生类是基类的继承,既然是继承,派生类就能添加一些基类没有的成员变量,所以取值范围才大啊
vwxyzh 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 ibinggo 的帖子:]
派生类是基类的继承,既然是继承,那么派生类的取值范围就比基类大,取值范围大应该显示转换啊?
[/Quote]
lz理解错了
派生类是基类的继承,既然是继承,那么派生类就更具体,既然更具体,那么符合派生类的情况就更少,所以取值范围就更小
wangguosong 2009-02-06
  • 打赏
  • 举报
回复
3楼的都说啦哈没啥好说的啦
happychou 2009-02-06
  • 打赏
  • 举报
回复
基类派生类对象之间的关系
class A{}
class B : A {}
class C: A {}
B b = new B();
C c = b; //错误,因为类型不同
A a = b; //这样写是正确的,但是一定要注意:
这样做有一个明显的限制 a 对象只能访问基类中的成员不能访问派生类中的成员
这就是为什么C#完全面向对象的原因,因为C#中所有的东西都继承自System.Object,任何东西都能赋给一个object变量
ljhcy99 2009-02-06
  • 打赏
  • 举报
回复
这个跟 数据类型的转换不一样。


数据类型有 向宽转换(隐式) 向窄转换(显式)


子类 是特殊的 父类。所以可以直接赋给父类对象,反之不可。
kingkwang 2009-02-06
  • 打赏
  • 举报
回复
基类只能引用派生类。但派生类不能转换成基类

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧