习惯先贴代码:

Code
using System;
public class MyClass
{
public static void Main()
{
A a = new A();
B b = new B();
BB bb = new BB();
a.Fun();
b.Fun();
bb.Fun();
Console.WriteLine("~~~~~~~~~~~~~~~~~~`");
A ab = new B();
A abb = new BB();
ab.Fun(); //B.Fun() B use override
abb.Fun(); //A.Fun() BB use new
Console.WriteLine("A ab = new B(); ab's type is {0}", ab.GetType().ToString());
if (ab is A)
Console.WriteLine("But ab is also A");
Console.ReadKey();
}
}
class A
{
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
class B : A
{
public override void Fun()
{
Console.WriteLine("B.Fun() using 'override'");
}
}
class BB : A
{
public new void Fun()
{
Console.WriteLine("BB.Fun() using 'new' ");
}
}
好了,让我们来分析一下吧。
代码的前一部分就是“~~~~~~~~~~”之上,应该没有什么好说的了。
关键就是接下来声明“A ab = new B();”后,如果对父类的虚函数方法在子类中使用了override重写,则执行的是子类中的方法。如果在子类中是使用new来重写父类的方法,则执行的是父类的方法。
在这里,我们可以这样来理解,override就好比一个橡皮擦,当它出现时,直接擦除父类的方法,然后把自己的放在上面。
如果我们在子类中用的是new,则打个比方就是没有那个橡皮擦,该是谁的就是谁的。