看一下如下這段代碼,思考它的結果應該是什麼
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關鍵字會使繼承鏈斷裂;