class Program
    {
        static void Main(string[] args)
        {
            BaseClass c1 = new BaseClass();
            MyClass c2 = new MyClass();
            c1 = c2;
            c1.Fun1();
            Console.ReadKey();
        }
    }    class BaseClass
    {
        public void Fun1()
        {
            Console.WriteLine("BaseClass");
        }
    }    class MyClass : BaseClass
    {
        public new void Fun1()
        {
            Console.WriteLine("MyClass");
        }
    }为什么c1 = c2后,c1.Fun1()会调用基类中的方法?

解决方案 »

  1.   

    看你的定义:BaseClass c1
    c1 是BaseClass 类型,当然调用BaseClass的方法
    运行时设断点,看看c1是什么吧
      

  2.   

    此时c1不是已经指向MyClass了吗?
      

  3.   

    hold住, if resolved in minute, please asign the score to me!
      

  4.   

    你自己设置断点,看看c1类型
                  BaseClass c1 = new BaseClass();
                MyClass c2 = new MyClass();
                c1 = c2;
    c1 = c2;不同类型,你能这么写,只是因为C#的规定“子类可以代替父类出现”。c1类型并没改变
      

  5.   

    这就是用了new,
    不管c1 = c2这句有木有,
    结果都一样,
    想调用MyClass的Fun1()方法就用:
    ((MyClass)c1).Fun1();
      

  6.   

    除非你在父类写虚方法,子类来重写。不过这样你就不能建立BaseClass对象了
    这也从侧面说明 c1的类型是BaseClass。类型定义后就固定不能改了,这也是C#公理
      

  7.   

    要调用子类,只有把c1转换成子类
    ((MyClass)c1).Fun1();//这样就行什么类型对应什么方法
      

  8.   

    正解;正是因为c1是父类,因此,调用的方法为父类的;如果此处c2含有自己的独立方法method1,在c1中也是不可用的。
      

  9.   

    class Program
        {
            static void Main(string[] args)
            {
                BaseClass c1 = new BaseClass();
                MyClass c2 = new MyClass();
                c1 = c2;
                c1.Fun1();
                Console.ReadKey();
            }
        }    class BaseClass
        {
            public virtual void Fun1()
            {
                Console.WriteLine("BaseClass");
            }
        }    class MyClass : BaseClass
        {
            public override void Fun1()
            {
                Console.WriteLine("MyClass");
            }
        }
      

  10.   

    和new关键字无关。因为基类的Fun1()是非virtual的,c1 = c2这句只是表明派生类可以隐式的转换为基类,没有其他的意思。
      

  11.   

    LZ 为什么要  c1等 c2呢?实现多态 ?
    那么c1里面的方法要写成 virtual虚方法,然后  子类override重写这个方法