class Program
    {
        static void Main(string[] args)
        {
            Student b = new Student();
            (Person)b.work();    //这样写,为什么要不得
            Console.ReadKey();
        }
    }
    class Person
    {
        public virtual void work()
        {
            Console.WriteLine("我正在工作");
        }
    }
    class Student : Person
    {
        public override void work()
        {
            Console.WriteLine("我正在认真学习");
        }
    }
上述代码为什么会报错呢?
本人到处查询一直没弄懂父类与子类的相互强制转换的资料,百度里面也没几个说清楚,请教一下:
父类与子类的强制转换的知识,谢谢!!!

解决方案 »

  1.   

    首先你这样写(Person)b.work(); 就从语法上不正确
    b.work是方法,而Person是个类
    能转换吗
    如果你想看结果
    这样做 ((Person)stu).work();
    此时的结果是“我正在认真学习”
    因为调用的还是Student的work方法
    它已经把Person里的重写 !
      

  2.   

    出错是语法错误
    ((Person)s).work();不是不能转换
      

  3.   

    而这样写的话
      Person per = new Person();
                ((Student)per).work();
    就会出错
    这样想下
    (人类)学生  可以
    (学生)人类   就有问题了
      

  4.   

    (Person)b.work();是把work方法的返回值转换为Person类的实例,这当然不行。
      

  5.   

    同意#3楼的。这跟转换无关。(Person)b.work();这就是要把b.work()方法返回的对象强制转换为Person。可是你命名声明work方法返回类型为void啊?!应该写为((Person)b).work();才对。
      

  6.   

    class Program
      {
      static void Main(string[] args)
      {
      Student b = new  Person();//请看清父类和子类的关系 
      (Person)b.work(); 
       Console.ReadKey();
      }
      }
      class Person
      {
      public virtual void work()
      {
      Console.WriteLine("我正在工作");
      }
      }
      class Student : Person
      {
      public override void work()
      {
      Console.WriteLine("我正在认真学习");
      }
      }
      

  7.   

    第一段代码:
    class Program
        {
            static void Main(string[] args)
            {
                Person stu = new GoodStudent();
                stu.work();
                ((Student)stu).work();    //把stu转换成了Student
                ((GoodStudent)stu).work();    //把stu转换成了GoodStudent
                Console.ReadKey();
            }
        }
    class Person
        {
            public virtual void work()
            {
                Console.WriteLine("我正在工作");
            }
        }
    class Student : Person
        {
            public new void work()
            {
                Console.WriteLine("我正在认真学习");
            }
        }
    class GoodStudent : Student
        {
            public new void work()
            {
                Console.WriteLine("我都学会了,玩呢");
            }
    }
    第二段代码:
    class Program
        {
            static void Main(string[] args)
            {
                GoodStudent stu = new GoodStudent();
                ((Person)stu).work();
                ((Student)stu).work();
                ((GoodStudent)stu).work();
                Console.ReadKey();
            }
        }
        class Person
        {
            public virtual void work()
            {
                Console.WriteLine("我正在工作");
            }
        }
        class Student : Person
        {
            public new void work()
            {
                Console.WriteLine("我正在认真学习");
            }
        }
        class GoodStudent : Student
        {
            public new void work()
            {
                Console.WriteLine("我都学会了,玩呢");
            }
        }两段代码一对比,就迷糊了,(类名)对象名...括号内的级别到底比对象高还是低啊,上面的例子,两种情况都有
      

  8.   

     Student b = new Person();//请看清父类和子类的关系
    编译不通过!
      

  9.   

    第一段代码
    stu.work();
     stu是Person的实例
     ((Student)stu).work();调用Student
    ((GoodStudent)stu).work();调用GoodStudent
      

  10.   

    是啊,stu是person的实例,那是person就一定是student吗?不会吧
      

  11.   

    第二段代码
     GoodStudent stu = new GoodStudent();声明的是GoodStudent
                ((Person)stu).work();类型转换为Person,调用Person
                ((Student)stu).work();类型转换为Student,调用Student
                ((GoodStudent)stu).work();类型转换为GoodStudent,调用GoodStudent
      

  12.   

    public class A
    {
        public A() { }
    }public class B : A
    {
        public B() { }
    }类 B 既是有效的 B,又是有效的 A。访问 B 对象时,可以使用强制转换操作将其转换为 A 对象。强制转换不会更改 B 对象,但您的 B 对象视图将限制为 A 的数据和行为。将 B 强制转换为 A 后,可以将该 A 重新强制转换为 B。并非 A 的所有实例都可强制转换为 B,只有实际上是 B 的实例的那些实例才可以强制转换为 B。如果将类 B 作为 B 类型访问,则可以同时获得类 A 和类 B 的数据和行为
      

  13.   

    简单明了的规则
         子类可以转换为父类    (father)child   Right
         父类不可以转换为子类  (child)father  wrong
      

  14.   

    先是有父类,然后才有子类,父类都没有,子类如何存在呢   
    子类当然能赋值给父类
    在软件里面,把父类都替换成它的子类,程序的行为没有变化,简单的说,子类型必须能够替换掉它们的父类型。
    Object是内存中的类型是不变的
    可以将子类型的object赋给父类型的变量,使用父类型的引用的时候无法访问子类型的成员
    Base a = new SubClass();
    然后可以使用赋值语句和强制类型转换将父类型变量赋给子类型变量。
    SubClass b = (SubClass)a;