public class A
        {
            public virtual void Fun1(int i)
            {
                Console.WriteLine(i);
            }            public void Fun2(A a)
            {
                a.Fun1(1);
                Fun1(5);
            }
        }        public class B : A
        {
            public override void Fun1(int i)
            {
                base.Fun1(i + 1);
            }
        }
        public static void Main()
        {
            B b = new B();
            A a = new A();
            // a.Fun2(b)是指先执行A类下的Fun2函数
            //Fun2函数下第一步是a.Fun1(1);
            //但实际参数是a也就是执行a.Fun1(1);
            //那b.Fun1(1)函数是在B类当中重载过的
            //其内容是base.Fun1(i+1);
            //也就是执行Fun1(1+1)
            //结果是2
            //然后执行Fun1(5) 
            //结果是5            a.Fun2(b);            // b.Fun2(a)是指先执行B类下的Fun2函数
            // 可B类本身就没有Fun2函数 只有执行它的基类的Fun2函数
            //但实际参数是a也就是执行a.Fun1(1);
            //结果是1
            //然后执行Fun1(5) 注意这里的Fun1(5)实际上是b.Fun1(5)
            //实际执行的结果是base.Fun1(5+1);
            //结果是6
            b.Fun2(a);
            Console.ReadLine();
        }请问
1。类b里的override是不是就完全把类a里的fun1()方法覆盖了。如果是那b.Fun2(a)怎么结果是1、6呢, 
2。还有new和override好象都可以覆盖是吧,他们有什么区别呢。
3。上面的题目的解释感觉晕乎,谁可以解释详细点呢,谢谢。

解决方案 »

  1.   

    看着真乱乎
    你是想知道为什么是6是吧
    你调用的是b.Fun2(a);
    这还真不是语言好表达的
    其实你的类实际是这样的。。
    你调用的是b类的fun2 
    public class A 
            { 
                public virtual void Fun1(int i) 
                { 
                    Console.WriteLine(i); 
                }             public void Fun2(A a) 
                { 
                    a.Fun1(1); 
                    Fun1(5); 
                } 
            }         public class B : A 
            { 
                public override void Fun1(int i) 
                { 
                    base.Fun1(i + 1); 
                }
                 public void Fun2(A a) 
                { 
                    a.Fun1(1); 
                    Fun1(5); //调用上面的fun1,
                } 
     
            } 
      

  2.   

    1、你的注释里面已经说得很清楚了
    2、用了new在父类中就会忽略子类的多态实现
    3、这个题目没什么高深的,只是在忽悠人。
      

  3.   

    因为你b继承了a
    所有也继承了a类的Fun2方法
    所以
       b.Fun2(a); 
    是调用b类的fun2并不时a类的fun2、
    而你override是从写了fun1方法。没有从写fun2
      

  4.   

    我帮你理解一下第二条吧。比如fun(A a)这个函数 ,你可以穿入A,也可以传入A的子类B。当在函数体内调用a.xxx的时候,而且xxx为虚方法。
    如果传入的是A这个和普通方法一样。
    如果传入的是B,如果B的xxx方法是override的就会调用B类中的实现,如果是new的则不会调用B类中的xxx。
      

  5.   

    override是重写基类的方法,
    new是覆盖基类的方法
      

  6.   

    override是重写基类的方法,值针对本方法。
    new是覆盖基类的方法。针对整个类。包括类成员!
      

  7.   

     b.Fun2(a); 
    因为b中没有fun2()方法,它继承和调用a中的fun2()方法。2楼说的很清楚!