關於C 多型的思考

2022-02-02 19:49:31 字數 2117 閱讀 8454

c# 中,可以如下定義:

base father = new derived();

father 是基類引用,指向子類物件,這一點有點類似c++。

該引用的使用模式如下(先說結論)——

測試**如下:

using

logging;

class

base

public

virtual

void

show2()

public

void myself()

}class

derived: base

public

void show2()

public

void show3()

public

void myself()

static

void

main()

}

view code

編譯 derived father:

$ csc tryit.cs

microsoft(r) visual c# 編譯器 版本 2.9.0.63208 (958f2354)

tryit.cs(22,17): warning cs0114: '「derived.show2()」隱藏繼承的成員「base.show2()」。若要使當前成員重寫該實現,請新增關鍵字 override。否則,新增關鍵字 new。

tryit.cs(30,17): warning cs0108: '「derived.myself()」隱藏繼承的成員「base.myself()」。如果是有意隱藏,請使用關鍵字 new。

method of derived::show()

method of derived::show2()

a new method of derived::show3()

method of derived::myself()

編譯 base father (已注釋 t.show3() 呼叫,否則編譯失敗):

$ csc tryit.cs -define:base

microsoft(r) visual c# 編譯器 版本 2.9.0.63208 (958f2354)

tryit.cs(22,17): warning cs0114: '「derived.show2()」隱藏繼承的成員「base.show2()」。若要使當前成員重寫該實現,請新增關鍵字 override。否則,新增關鍵字 new。

tryit.cs(30,17): warning cs0108: '「derived.myself()」隱藏繼承的成員「base.myself()」。如果是有意隱藏,請使用關鍵字 new。

method of derived::show()

method of base::show2()

method of base::myself()

對於 base father = new derived() 的形式來說,似乎是一種新老結合的方式:對於virtual方法,可以自動追尋子類的實現,而非virtual則根據base型別決定。

實際上,這個模式與c++完全相同,測試**如下:

//

g++ ctry.cpp -std=c++11

#include class

base

virtual

void

show2()

void myself()

};class derived: public

base

void show2()

void

show3()

void

myself()

};int

main()

view code

編譯,執行:

$ g++ ctry.cpp -std=c++11

$ ./a.exe

method of derived::show()

method of derived::show2()

method of base::myself()

# 請忽視 c# 對show2() 的呼叫,那裡本應該寫乙個override的~

關於C 繼承與多型的思考

在網上看到了一句話 繼承是子類使用父類的方法,而多型則是父類使用子類的方法。我覺得這句話說的還是蠻不錯的 c 中的繼承符合下列規則 1 繼承是可傳遞的。如果c從b中派生,b又從a中派生,那麼c不僅繼承了b中宣告的成員,同樣也繼承了a中的成員。object 類作為所有類的基類。2 派生類 子類 應當是...

C 中模板與多型的思考

開發中遇到個問題,問題如下 有7中型別的資訊,每個型別有相同的地方,也有不用之處,但是類內函式都一樣。最開始考慮用模板實現,因為類內函式一樣,於是寫完,編譯,報錯,查問題。發現模板函式不能在cpp檔案中實現,要將實現與定義都放在.h檔案中。為什麼?這是因為 模板例項化是發生在編譯期 compile ...

關於C 多型的學習

父類virtual type funcname arg 子類type funcname arg type funcname arg完全一致就算子類重寫了。覆蓋了基類的func。還可以 子類直接寫個override example type funcname arg override 這個是c 11的...