您的位置:程序门 -> .net技术 -> c#



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于c#中的基类到子类的类型转换[已结贴,结贴人:zzhdavid]
发表于:2007-01-08 20: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求助的!!!
发表于:2007-01-08 20:39:581楼 得分:0
还有c++严禁基类到子类的转换,而c#中允许,是吗?意义?
----------------------------------------------------
晕,好像没有人说c#中允许从基类到子类的转换吧?
lz还是仔细看看在何处出的错吧..
发表于:2007-01-08 20:46:292楼 得分:0
这样也能转换啊!强!
发表于:2007-01-08 20:51:053楼 得分:0
楼主是不是误解了...

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

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

如果是这样:
baseclass   obj3=obj2;
deriveclass   obj4=(deriveclass)obj3;//这样是可以的..
发表于:2007-01-08 20:56:034楼 得分:20
我们知道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;
发表于:2007-01-08 21:35:175楼 得分:0
baseclass   obj3=obj2;
deriveclass   obj4=(deriveclass)obj3;

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

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

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

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

非常谢谢大家!
发表于:2007-01-08 21:43:536楼 得分:0
to:即将子类转换成基类类型后赋给基类对象,再对此基类对象进行还原转换成
子类对象,理解,请问这样能否保持最初原始子对象的数据完整性

是的..

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

那你把代码贴出来看下..
发表于:2007-01-08 21:49:427楼 得分:0
这样转的话编译器怎么分配内存呢?
发表于:2007-01-08 22:15:278楼 得分:0
在大家的帮助下,问题终于解决了
是我误解了向下转换的意思,就像大家说的是将子类对象强制转换为基类型,再将其还原
成子类型,其实原始数据类型还是一致的,理所当然这种转换就合理。我的理解没错了吧

很高兴能在这里解决问题!
尤其感谢liujia_0421
发表于:2007-01-08 22:23:049楼 得分:0
to:就像大家说的是将子类对象强制转换为基类型

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

student   std=new   student( "111 ", "test ");
object   obj   =   std;//隐式转换就可以了..
发表于:2007-01-09 00:43:3810楼 得分:0
呵呵,路过。。。看来大家都解说清楚了。我就不用说了。
发表于:2007-01-09 00:48:2011楼 得分:0
c++里面可以
c#是不行的


快速检索

最新资讯
热门点击