关于C#中的基类到子类的类型转换

zzhdavid 2007-01-08 08:30:38
public class baseclass
{
public string str;
public baseclass(string str)
{
this.str = str;
}
public virtual void dis()
{
Console.WriteLine(str+"调用基类的dis函数");
}
}
public class deriveclass : baseclass
{
public string str2;
public override void dis()
{
Console.WriteLine(str2+"调用子类的dis函数");
}
public deriveclass(string str2):base("子类调用基类的构造函数")
{
this.str2 = str2;
}
}
static void Main(string[] args)
{
baseclass obj = new baseclass("构造基类对象");
obj.dis();
deriveclass obj2 = new deriveclass("构造子类对象");
obj2.dis();

obj2 = (deriveclass)obj
obj2.dis();;//此处是我认为出错的地方

obj = obj2;
obj.dis();

obj2 = (deriveclass)obj;
obj2.dis();
}
/*上面是我写的验证C#中,从上到下的类型转换问题。
我的疑惑是:将基类对象强制转换为子类类型此过程理应不会出错
为什么那个obj2.dis()调用就出错了呢,难道它是因为obj2是子类型
它就会先去调用基类的版本,发现基类中此函数为虚,再到派生类中找?
*/

**********烦请大侠把这个问题讲得透彻一点,最好结合C++
**********还有C++严禁基类到子类的转换,而C#中允许,是吗?意义?

确实是身边没有合适的人来解答我的问题,特向CSDN求助的!!!
...全文
3083 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
byy19631028 2011-06-10
  • 打赏
  • 举报
回复
TO:
平行类之间不能进行转换,(如A为基类,B和C都是A的派生类)
B和C之间是不能转换的,且就算B先转换为A再转换C也是不行的,因为原始类型不同。
那我确实有这样的需求,该怎么办????
谢谢大家了!
studylr 2008-11-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liujia_0421 的回复:]
我们知道object是所有类的父类..

比如有一个类student,有sno,sname等属性..

难道你能直接把object的对象直接转成student类型?

student std=(student)obj;//试问obj从哪去弄sno,sname等属性?

而如果先将一个student对象隐式转成object对象,再转回来是可以的,即:
student std=new student( "111 ", "test ");
Object obj=std;
student std1=(student)std;
[/Quote]
我不知道你定义了student std ,然后又(student)std是啥意思,还是是我这样的:
student std=new student( "111 ", "test ");
Object obj=std;
student std1=(student)obj;
stevenjin 2008-05-24
  • 打赏
  • 举报
回复
大家知道object是所有类的基类,我用一个呆板的办法作了如下转换,发现可以通过编译:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Prog
{
class ObjState
{

}
class ThreadPoolDemo
{

public void Task(object stateObj)
{
ObjState stObj;
stObj = (ObjState)stateObj; //将object类类型转换为其它类类型
}
static void Main(string[] args)
{

}
}
}
但做如下修改后,编程器称不能做强制类型转换:
static void Main(string[] args)
{
Object obj = new Object();
ObjState objstd;
objstd = (ObjState)obj;
}
于是我把Object对像赋了个空值就可以了:
static void Main(string[] args)
{
Object obj = null;
ObjState objstd;
objstd = (ObjState)obj;
}
kawensong 2008-01-30
  • 打赏
  • 举报
回复
基类转换为子类,..最后子类对象的副本还是转为基类对象了啊,
...感觉不到多大作用啊,不就相当于转了个圈吗,可能我太菜吧
Reeezak 2007-01-09
  • 打赏
  • 举报
回复
C++里面可以
C#是不行的
编程夜猫 2007-01-09
  • 打赏
  • 举报
回复
呵呵,路过。。。看来大家都解说清楚了。我就不用说了。
liujia_0421 2007-01-08
  • 打赏
  • 举报
回复
TO:就像大家说的是将子类对象强制转换为基类型

子类转基类时,没有必要强制转换..

student std=new student("111","test");
Object obj = std;//隐式转换就可以了..
zzhdavid 2007-01-08
  • 打赏
  • 举报
回复
在大家的帮助下,问题终于解决了
是我误解了向下转换的意思,就像大家说的是将子类对象强制转换为基类型,再将其还原
成子类型,其实原始数据类型还是一致的,理所当然这种转换就合理。我的理解没错了吧

很高兴能在这里解决问题!
尤其感谢liujia_0421
charles_y 2007-01-08
  • 打赏
  • 举报
回复
这样转的话编译器怎么分配内存呢?
liujia_0421 2007-01-08
  • 打赏
  • 举报
回复
TO:即将子类转换成基类类型后赋给基类对象,再对此基类对象进行还原转换成
子类对象,理解,请问这样能否保持最初原始子对象的数据完整性

是的..

TO:书上同时也明确说明,平行类之间不能进行转换,(如A为基类,B和C都是A的派生类)
B和C之间是不能转换的,且就算B先转换为A再转换C也是不行的,因为原始类型不同。
可能是我误解了书上那句原话,那它是什么意思?但书上代码也确实是这个意思,唉!

那你把代码贴出来看下..
zzhdavid 2007-01-08
  • 打赏
  • 举报
回复
baseclass obj3=obj2;
deriveclass obj4=(deriveclass)obj3;

上面有几位说了,即将子类转换成基类类型后赋给基类对象,再对此基类对象进行还原转换成
子类对象,理解,请问这样能否保持最初原始子对象的数据完整性。。。。。

我确实很认真的看了书上的说明和代码,向上转换不用说了
书上还提一个向下转换,摘抄原文如下:

“基类的对象转换为派生类时发生的是向下转换”

书上同时也明确说明,平行类之间不能进行转换,(如A为基类,B和C都是A的派生类)
B和C之间是不能转换的,且就算B先转换为A再转换C也是不行的,因为原始类型不同。
可能是我误解了书上那句原话,那它是什么意思?但书上代码也确实是这个意思,唉!

非常谢谢大家!
liujia_0421 2007-01-08
  • 打赏
  • 举报
回复
我们知道object是所有类的父类..

比如有一个类student,有sno,sname等属性..

难道你能直接把object的对象直接转成student类型?

student std=(student)obj;//试问obj从哪去弄sno,sname等属性?

而如果先将一个student对象隐式转成object对象,再转回来是可以的,即:
student std=new student("111","test");
Object obj=std;
student std1=(student)std;
liujia_0421 2007-01-08
  • 打赏
  • 举报
回复
楼主是不是误解了...

以你的写的例子来说明:
baseclass obj = new baseclass("构造基类对象");
deriveclass obj2 = new deriveclass("构造子类对象");

如果你直接obj2 = (deriveclass)obj;这样肯定是错误的..

如果是这样:
baseclass obj3=obj2;
deriveclass obj4=(deriveclass)obj3;//这样是可以的..
hunter0116 2007-01-08
  • 打赏
  • 举报
回复
这样也能转换啊!强!
kissknife 2007-01-08
  • 打赏
  • 举报
回复
还有C++严禁基类到子类的转换,而C#中允许,是吗?意义?
----------------------------------------------------
晕,好像没有人说C#中允许从基类到子类的转换吧?
LZ还是仔细看看在何处出的错吧..

110,499

社区成员

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

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

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