C 過載和繼承混用會怎樣?

2021-10-01 23:51:58 字數 1822 閱讀 3793

overload就是過載,大家都會。但是大家有沒有想過,我們呼叫乙個過載方法的時候會呼叫哪個呢??

答案是和簽名最接近的乙個。

大家是不是看到這裡已經開始覺得這個部落格很無聊了,都是這麼簡單的內容。沒關係,我們慢慢深入。

我們知道方法為了能夠減少書寫個數, 提供了乙個叫預設引數的東西

voidp(

object p1,

bool p2 =

true

)

這樣我們可以通過p(p1)或者p(p1true)兩種方式來進行呼叫

如果我們這個時候的過載情況時這樣的

voidp(

object p1)

voidp(

object p1,

bool p2 =

true

)

此時再呼叫,p(p1)執行的是上乙個函式。一種理解方式是,第二個方法比第乙個能夠多處理一種情況p(p1,true)。所以我們專事專用,選擇更具體的方法。

ok.c#作為乙個oo語言,還有乙個特點就是繼承,這個同樣反映在方法裡

voidp(

object p1)

對於上述方法,可以使用object作為引數,也可以使用更加具體的object子類

那麼如果我們的過載情況時這樣的

voidp(

object p1)

void

p(exception p1)

那麼如果我們傳入的引數是exception或者是exception的子類,那麼執行第二個,如果是exception的父類或者其他object的派生類,則執行的是第乙個函式

同樣的思路,如果執行p(new exception())時第二個函式,更加具體或者說更加"專業"

那麼重點來了,在如下的條件下,執行p(null),輸出時什麼?

voidp(

object p1)

void

p(exception p1,

bool p2 =

true

)

不知道了是吧,那我們換成p(new exception())。第一反應是不是應該輸出"第二個"。沒錯,微軟也是這麼做的。我們這麼想,p2涉及的狀態只有有和無兩種。而繼承涉及的狀態多如牛毛

所以在函式簽名匹配時繼承高於預設引數

那麼我們回來看p(null)的輸出

恩,是不是還是啥都不知道。沒錯這邊涉及null應該是更加具體,還是更加抽象。

其實我也不知道,於是就做了demo測試,結果是輸出"第二個"

所以我們從現象反推,我們可以這麼想null可以為所有object物件賦值,所null更具體

ok,那我們需要輸出"第乙個"是咋辦咧,可以使用強轉p((object)null)

不過目前我這邊沒有找到任何確定文件表明這乙個特性,所以有可能是編譯器未定義的行為,所以不建議大家隨意使用

本文會經常更新,請閱讀個人部落格原文: ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。

繼承和過載

繼承的目的 實現 重用 派生的目的 當新的問題出現原有程式無法解決 或不能完全解決 時,需要對原有程式進行改造 1 當建立乙個類時,您不需要重新編寫新的資料成員和成員函式,只需指定新建的類繼承了乙個已有的類的成員即可。這個已有的類稱為 基類,新建的類稱為 派生類。2 乙個類可以派生自多個類,這意味著...

c和obj c如何混用

1 obj c的編譯器處理字尾為m的檔案時,可以識別obj c和c的 處理mm檔案可以識別obj c,c,c 但cpp檔案必須只能用c c 而且cpp檔案include的標頭檔案中,也不能出現obj c的 因為cpp只是cpp。2 在mm檔案中混用cpp直接使用即可,所以obj c混cpp不是問題 ...

c和obj c如何混用?

1 obj c的編譯器處理字尾為m的檔案時,可以識別obj c和c的 處理mm檔案可以識別obj ccc 但cpp檔案必須只能用c c 而且cpp檔案include的標頭檔案中,也不能出現obj c的 因為cpp只是cpp 2 在mm檔案中混用cpp直接使用即可,所以obj c混cpp不是問題 3 ...