C#虛函數virtual機制

看一下如下這段代碼,思考它的結果應該是什麼

using System;

namespace test
{
    class Program
    {
        class A
        {
            public A()
            {
                func();
            }
            virtual public void func()
            {
                Console.WriteLine("base");
            }
        }
        class B:A
        {
            public B():base()
            {
                func();
            }
            public override void func()
            {
                Console.WriteLine("derived");
            }

        }
        static void Main(string[] args)
        {
            B b = new B();
        }
    }
}

我一開始的理解就是,先調用父類的構造函數再調用子類,不就是base,derived嘛;

但是我運行之後才發現,竟然是derived,derived,也就是父類構造函數調用的虛函數就是子類重寫的;

總結了一下知乎下的回答C++和C#的virtual爲什麼會出現不同的結果,以及查了一下C#的機制(https://www.cnblogs.com/lovexinger/archive/2010/04/19/1715683.html),總結如下

  • C#中調用虛函數時,會判斷是否是虛函數,如果是虛函數,首先到派生類中查找是否有覆蓋,如果有就使用派生類的;

  • 在構造函數中調用虛函數,通常是不建議的;

如果把上述代碼中的override替換成new關鍵字,最終得到的結果就是base,derived了,因爲new關鍵字會使繼承鏈斷裂;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章