天天看點

C#方法隐藏new、虛方法virtual、重寫override及隐藏和重寫的差別

【概念】方法隐藏使用關鍵字new、方法重寫使用關鍵字override,虛函數使用關鍵字virtual修飾的函數。虛函數從功能上和普通的函數沒有差別,虛函數可以被子類隐藏,也可以被子類重寫,而非虛函數隻能被子類隐藏。

那麼重寫和隐藏的差別是什麼呢?運作以下代碼,發現,在向上轉型時輸出的結果不一樣。原理如下:

隐藏原理如下:

C#方法隐藏new、虛方法virtual、重寫override及隐藏和重寫的差別
C#方法隐藏new、虛方法virtual、重寫override及隐藏和重寫的差別
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"
    }
}