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);
    } B b = new B();
 A a = new A();
 a.Fun2(b);
 b.Fun2(a);
解释一下,为什么输出的是2,5,1,6
谢谢

解决方案 »

  1.   

    1.
    a.Fun2(b);
    public void Fun2(A a) 
    {
            a.Fun1(1); //参数a实际上是个属于B的对象,将调用在B中覆盖的相应方法
       //但其实现是base.Fun1(i + 1),即A类中的Fun1,参数是2,所以输出为2        Fun1(5);  //当前对象是个属于A的对象,就调用A类中相应的方法,所以输出为5
    }2.
    b.Fun2(a);
    public void Fun2(A a) 
    {
            a.Fun1(1); //参数a实际上是个属于A的对象,将调用在即A类中的Fun1,参数是1,所以输出为1        Fun1(5);  //当前对象是个属于B的对象,调用B中覆盖的相应方法,
      //但其实现是base.Fun1(i + 1),即A类中的Fun1,参数是6,所以输出为6
    }
      

  2.   

    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);
        }    static void Main(string[] args)
        {
            B b = new B();
            A a = new A();
            a.Fun2(b); 
            //当前对象为基类对象,传的是派生类的对象
            /*
    a.Fun1(1);由于a指向派生类的对象,所以调用派生类override的方法(又调用了基类的Fun1),输出2
    Fun1(5);相当于this.Fun1(5),所以调用自己的方法,输出5
           */
            b.Fun2(a);
            //当前对象为派生类对象,传的是基类的对象
            /*
    a.Fun1(1);由于a就是基类的对象,不存在多态的问题,调用自己的方法,输出2
    Fun1(5);当前对象事实上派生类的对象,所以调用派生类的方法(又调用了基类的Fun1),输出6
           */
        }
    }