C#基類引用指向子類實例-虛方法的應用介紹

C#基類引用指向子類實例-虛方法的應用介紹

所謂“基類引用指向子類”是指聲明爲父類對象,但實例化創建子類對象。

例:

類B繼承類A;當我們聲明一個A類型的變量,而實例化爲B類型,即A a= new B()是完全可以的。要注意的是,這個時候可以訪問a中的是類A中有的元素。B中自定義的元素是訪問不到的。

當調用aaa方法時得到的結果是:

因爲我們實例化的確實是B類型的,所以是存在變量bb的。至於爲什麼調用的是B類型的方法而不是A類型的方法,因爲A中的方法aaa()定義爲虛方法。B類進行了重寫。

當調用a的aaa()函數時:

1.      首先系統會直接去檢查這個對象申明定義的類,即申明類,看所調用的函數是否爲虛函數;

2.      如果不是虛函數,那麼它就直接執行該函數。而如果有virtual關鍵字,也就是一個虛函數,那麼這個時候它就不會立刻執行該函數了,而是轉去檢查對象的實例類。

3.      在這個實例類裏,他會檢查這個實例類的定義中是否有重新實現該虛函數(通過override關鍵字),如果是有,那麼OK,它就不會再找了,而馬上執行該實例類中的這個重新實現的函數。而如果沒有的話,系統就會不停地往上找實例類的父類,並對父類重複剛纔在實例類裏的檢查,直到找到第一個重載了該虛函數的父類爲止,然後執行該父類裏重載後的函數。

 

 本例符合第2種情況,因此得到上述控制檯輸出。C# virtual定義虛函數在編譯期間是不被靜態編譯的,它的相對地址是不確定的,它會根據運行時期對象實例來動態判斷要調用的函數。

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