這個實例是子類的,可是由於你聲明時是用父類聲明的,因此你用正常的辦法訪問不到子類本身的成員,只能訪問到從父類繼承來的成員。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