这个实例是子类的,可是由于你声明时是用父类声明的,因此你用正常的办法访问不到子类本身的成员,只能访问到从父类继承来的成员。ide
在子类中用override重写父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是子类中重写的方法;spa
若是子类中用new覆盖父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是父类中的虚方法;blog
/// <summary>
/// 父类
/// </summary>
public class ParentClass
{
public virtual void ParVirMethod()
{
Console.WriteLine("父类的方法...");
}
}
/// <summary>
/// 子类1
/// </summary>
public class ChildClass1 : ParentClass
{
public override void ParVirMethod()
{
Console.WriteLine("子类1的方法...");
}
}
/// <summary>
/// 子类2
/// </summary>
public class ChildClass2 : ParentClass
{
public new void ParVirMethod()
{
Console.WriteLine("子类2的方法...");
}
public void Test()
{
Console.WriteLine("子类2的其余方法...");
}
}
ParentClass par = new ChildClass1(); par.ParVirMethod(); //结果:“子类1的方法”,调用子类的方法,实现了多态
par = new ChildClass2(); par.ParVirMethod();//结果:“父类的方法”,调用父类的方法,没有实现多态
深究其缘由,为什么二者不一样,是由于原理不一样:
override是重写,即将基类的方法在派生类里直接抹去从新写,故而调用的方法就是子类方法;继承
而new只是将基类的方法在派生类里隐藏起来,故而调用的仍旧是基类方法。it