為什麼不能根據返回型別區分過載?

634828354發表於2017-08-15
過載(Overload)和重寫(Override)的區別。過載的方法能否根據返回型別進行區分?
答:方法的過載和重寫都是實現多型的方式,區別在於前者實現的是編譯時的多型性,而後者實現的是執行時的多型性。過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常(里氏代換原則)。過載對返回型別沒有特殊的要求。

面試題:華為的面試題中曾經問過這樣一個問題 – “為什麼不能根據返回型別來區分過載”,快說出你的答案吧!
因為呼叫時不能指定型別資訊,編譯器不知道你要呼叫哪個函式。
例如
float max(int a, int b); int max(int a, int b);

當呼叫max(1, 2);時無法確定呼叫的是哪個,單從這一點上來說,僅返回值型別不同的過載是不應該允許的。

再比如對下面這兩個方法來說,雖然它們有同樣的名字和自變數,但其實是很容易區分的: 
void f() {} int f() {}

若編譯器可根據上下文(語境)明確判斷出含義,比如在 int x=f()中,那麼這樣做完全沒有問題。
然而, 我們也可能呼叫一個方法,同時忽略返回值;我們通常把這稱為“為它的副作用去呼叫一個方法”,
因為我 們關心的不是返回值,而是方法呼叫的其他效果。所以假如我們象下面這樣呼叫方法: f(); 

 怎樣判斷f()的具體呼叫方式呢?而且別人如何識別並理解程式碼呢?由於存在這一類的問題,
所以不能 根據返回值型別來區分過載的方法。

函式的返回值只是作為函式執行之後的一個“狀態”,他是保持方法的呼叫者與被呼叫者進行通訊的關鍵。
並不能作為某個方法的“標識”


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30046312/viewspace-2143540/,如需轉載,請註明出處,否則將追究法律責任。

相關文章