【概念】方法隐藏使用關鍵字new、方法重寫使用關鍵字override,虛函數使用關鍵字virtual修飾的函數。虛函數從功能上和普通的函數沒有差別,虛函數可以被子類隐藏,也可以被子類重寫,而非虛函數隻能被子類隐藏。
那麼重寫和隐藏的差別是什麼呢?運作以下代碼,發現,在向上轉型時輸出的結果不一樣。原理如下:
隐藏原理如下:
class Animal
{
public void Show()
{
Console.WriteLine("Animal Show");
}
}
//記憶體空間:堆、棧、方法區。調用方法就是從方法區中調用到棧中執行
class Cat : Animal
{
//1、Cat類中還能寫Show方法嗎?不考慮重載。答案:能。若再寫一個Show方法,則調用子類的方法。
//此處Show提示:Cat.Show()"隐藏繼承的成員Animal.Show()",如果是有意隐藏,請使用關鍵字new
//public void Show()
//{
// Console.WriteLine("Cat Show");
//}
public new void Show()
{
Console.WriteLine("Cat Show");
}
}
class Program
{
public static void Main(string[] args)
{
Cat c = new Cat();
c.Show();
//Q:a是調用的Cat.Show還是Animal.Show?A:調用的是Animal.Show,原理是在Cat類型中尋找Animal.Show方法
Animal a = new Cat();
a.Show();
}
}
using System;
class Animal
{
//virtual關鍵字,虛方法
public virtual void Show()
{
Console.WriteLine("Animal Show");
}
}
class Cat : Animal
{
//override重寫
public override void Show()
{
Console.WriteLine("Cat show");
}
}
class Program
{
public static void Main(string[] args)
{
//執行個體化一個Cat對象
Cat c = new Cat();
c.Show();
//列印結果是"Cat show"
Animal cc = new Cat();
cc.Show();
//列印結果是"Cat show"
}
}