c#函數覆蓋、隱藏、重載個人總結

(一)在子類中使用new時,隱藏了父類同型函數,如果不用new編譯器報警告。隱藏的效果是調用申明類型的函數定義執行,如:

class A

{

void Fun();

}

class B:A

{

new void Fun();

}

A a = new B();

A爲申明類型,B爲實例類型,則a.Fun()執行A.Fun(),如申明爲B b = new B(); b.Fun()執行B.Fun();

無論父類函數是否有virtual修飾符,以上效果不變。

(二)override重寫關鍵字必須與基類中virtual, abstract 或override使用,不可直接使用,否則編譯報錯。override效果是覆蓋父類同型函數,覆蓋的效果是執行實例類型的函數定義,如:

無論申明爲A a = new B(),還是B b = new B(), 均執行B.Fun();

A爲申明類型,B爲實例類型,則a.Fun()執行A.Fun(),如申明爲B b = new B(); b.Fun()執行B.Fun();

無論隱藏還是覆蓋父類函數,均可以採用在子類中執行base.Fun()調用父類函數。

(三)重載發生在同一個類中同名不同型函數中。

(四)virtual函數可以執行,abstract類似於純虛函數(pure virtual)不可執行,必須聲明在抽象類中,否則編譯報錯;須在子類中實現纔可以執行,而且必須實現,否則編譯報錯。由於抽象類不可實例化,所以只能執行子類的函數定義。


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