public class C1
    {
        public virtual void m1()
        {
            Console.WriteLine("C1:m1");
        }        public void m2()
        {
            Console.WriteLine("C1:m2");
        }
    }
public class C2 : C1
    {
        public override void m1()
        {
            Console.WriteLine("C2:m1");
        }
        public void m2()
        {
            Console.WriteLine("C2:m2");
        }        public virtual void m3()
        {
            Console.WriteLine("C2:m3");
        }    }//使用:
C1 c = new C2();
c.m1();             //C2:m1
c.m2();             //C1:m1
//c.m3();           //在C1中没有这个方法
问题:
类型转到上一级(父类),则子类可视的成员、方法减少。所以这一句
//c.m3();           //在C1中没有这个方法  
是可以理解。但这句
c.m1();             //C2:m1
就不明白。可视的成员、方法减少了,它怎么还能看到C2.m1()呢?
虽然重写方法的原理也了解。但还是想不通。请哪位大侠给小弟讲解一下。

解决方案 »

  1.   

    c.m3();           不出来是因为编译器不支持
    c其实还是一个C2的实例,他的虚方法是被覆盖过的
      

  2.   

    c.m3();           不出来是因为编译器不支持
    c其实还是一个C2的实例,他的虚方法是被覆盖过的
    ---------------------------------------------------------c其实还是一个C2的实例,即然是C2的实例。为什么看不到m3(),而看到m1()?
      

  3.   

    C是C1类的引用,指向的是一个C2的实例
    对外界而言,C只能执行所有C1类能做的事,所以它只能用m1,m2
    但是C1类的m1被重写过,所以虽然C有m1方法,但现在调用的是子类(C2)的m1方法只有m3,根本和C1没有关系,所以C访问不到m3除非 ((C2)C).m3();
      

  4.   

    C是C1类的引用,指向的是一个C2的实例???不明白這句話的含意.........可否解析詳細點,謝謝.