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

大家帮忙详细分析解答下关于继承的题目,被搞得有点晕...
public abstract class A 

  public A() 
  { 
  Console.WriteLine('A'); 
  } 

  public virtual void Fun() 
  { 
  Console.WriteLine("A.Fun()"); 
  } 
}

public class B: A 

  public B() 
  { 
  Console.WriteLine('B'); 
  }

  public new void Fun() 
  { 
  Console.WriteLine("B.Fun()"); 
  }

  public static void Main() 
  { 
  A a = new B(); 
  a.Fun(); 
  }
}

------解决方案--------------------
看了这个lz还不明白,就无能为力了:
C#的虚函数解析机制

------解决方案--------------------
任何一个没有使用 override 或 sealed 关键字的方法定义都将成为继承链的开端;
如果该类在定义方法时使用了 virtual 关键字,则会被附加到继承链中。
继承链的结束取决于两个因素:若子类中存在使用了 new 关键字的同名方法,则之前的继承链立刻结束(该方法不会被添加到继承链中);若子类中存在使用了 sealed 关键字的同名方法,则在将该方法添加到继承链后,然后结束继承链。


------解决方案--------------------
我想 打印 结果的 是:

A

B

A.Fun();

首先 我们 来分析一下 题目:

A a = new B(); 实例化对象,New B() 相当于 创建了B的实例化, 因为B是继承A的,所以。。。先打印出来的是 A, 再打印出来的就是子类里的B了,

最后它调用的方法是 a.Fun(); 因为 子类里
 public new void Fun()
{
Console.WriteLine("B.Fun()");
}

很明显它 并没有 重写 父类的 Fun() 方法,也就是 子类并没有override, 所以调用 a.Fun(); 方法的时候,打印出来的就是父类里的方法执行的 代码了。

不知道这样解析,Lz 是否理解?