日期:2014-05-18  浏览次数:20530 次

关于virtual和override的问题
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.
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
}