例一:
class Program
{
static void Main(string[] args)
{
B5 b5 = new B5();
b5.MethodB();
}
}
public class A5
{
public virtual void MethodA()
{
Console.WriteLine("A5.MethodA");
Console.Read();
}
public virtual void MethodB()
{
Console.WriteLine(this.GetType().ToString());
MethodA(); //父类引用指向子类对象
}
}
public class B5 : A5
{
public new void MethodA()//将这里的new改为override将又是另一种情况
{
Console.WriteLine("B5.MethodA");
Console.ReadLine();
}
}
例二:
class A
{
public A()
{
AA();
}
public virtual void AA()
{
Console.WriteLine("This is AA");
}
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
AA();
}
public override void AA() //将这里的override修改为new结果将是另一种情况
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
class programs
{
static void Main(string[] args)
{
B b = new B();
Console.ReadKey();
}
}
//注释:以上两个例子表明,当存在“父类引用指向子类对象”的情况时,不能明确明白执行的是子类方法,还是父类方法时,可以如下理解
//当父类方法为virtual A(),子类方法为override A()时,此时将执行子类方法,因为此时父类的方法被子类重写了;当子类方法被改为new A()时,此时将执行父类的方法
//(注意:这里指的是当存在父类的引用指向子类对象的情况,如果本身就是子类对象执行方法的话,站在子类的角度看,new A() 是为了显式隐藏基类中的方法)