程序:
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(); 
            b.Fun2(a);          
        } 
} 这个输出结果是1 和6
我不明白为什么,以我看该是输出2和6,请详细解说下

解决方案 »

  1.   

    b.Fun2(a);
     = a.Fun1(1);b.Fun1(5);
    有什么问题?
      

  2.   

    B b = new B();  创建实例。
                A a = new A();  创建实例。
                b.Fun2(a);  调用b的Fun2 ,b自己没Fun2,进入基类a的Fun2 public void Fun2(A a)   
           { 
                a.Fun1(1);   //实例a的Fun1(1)当然输出个 1。
                Fun1(5);     //这里由于是b的实例调用进来的,所以进入b的overide的Fun1 ,然后base.Fun1 (i + 1),调用基类的Fun1;  输出6 ,完毕。
            } 
      

  3.   

    a.Fun1()是virtual,而B又override了,那为什么a.Fun1(1)不是调用B.Fun1(1)呢?基类中是virtual的方法,派生类如果override的话,不是应该调用派生类中的方法么!
      

  4.   

    毫无悬念的代码,A 是 A,B 是 B,多看几遍代码,
      

  5.   

    为什么a.Fun1(1)不是调用B.Fun1(1)呢?里面已经表明a.了,可能调用b的吗/ 
    overide不是把所有的调用都overide了,否则之前的不白写了,如果有多重overide,难道我们只能调用最后一个overide的方法吗?多态性是根据对象来的,方法是对象的方法. 多看看书了解基本概念吧.
      

  6.   

    貌似中间的说错了,讲不清楚, 反正我只记的a. 开头的就是调用实例a里面的,overide只是覆盖方法,没有覆盖实例。
      

  7.   

    为什么a.Fun1(1)不是调用B.Fun1(1)
    ……
    你都A a = new A(); 还想怎么样?
      

  8.   

    public void Fun2(A a)   
           { 
                a.Fun1(1); 
                Fun1(5); 
            } 第一句里面的a是A a
    所以调用的是类A的Fun1
    第二句里面的Fun1是调用自己的方法
    也就是类B的Fun1
      

  9.   

    如果是
    a.Fun1(1); 
    a.Fun1(5); 
    输出的是 1,5a.Fun1(1); //调用A本身的Fun1方法
    Fun1(5);//调用覆盖方法
      

  10.   

    第一句里面的a是A a
    所以调用的是类A的Fun1
    第二句里面的Fun1是调用自己的方法
    也就是类B的Fun1
      

  11.   

    都已经清楚的调用base了,你觉得呢?