C/C++編程筆記:重載可以與繼承一起使用嗎?

如果我們在基類中有一個函數(shù),而在派生類中有一個同名函數(shù),那么可以從派生類對象中調(diào)用基類函數(shù)嗎?這是一個有趣的問題,作為實(shí)驗(yàn)可以預(yù)測以下C ++程序的輸出。
該程序的輸出為:
f(雙精度):6.3
f(雙精度):6.6
而不是假定的輸出:
f(整數(shù)):6
f(雙精度):6.6
重載不適用于C ++編程語言中的派生類。Base和Derived之間沒有重載分辨率。編譯器查看Derived的范圍,找到單個函數(shù)“ double f(double)”并調(diào)用它。它永遠(yuǎn)不會干擾Base的(封閉)范圍。在C ++中,沒有作用域之間的重載-派生類作用域不是該一般規(guī)則的例外。
現(xiàn)在考慮該程序的Java版本:
上面程序的輸出是:
f(整數(shù)):6
f(雙精度):6.6
因此,在Java中,重載可在與C ++相反的范圍內(nèi)進(jìn)行。Java編譯器根據(jù)用于調(diào)用方法的參數(shù)類型來確定要在編譯時執(zhí)行的重載方法的正確版本,這兩個類的重載方法的參數(shù)都會接收在調(diào)用中使用的參數(shù)的值并執(zhí)行重載方法。
最后,讓我們嘗試以下C#程序的輸出:
注意:Console.ReadKey()用于暫??刂婆_。它類似于C / C ++中的getch。
上面程序的輸出是:
f(雙精度):6.3
f(雙精度):6.6
代替假設(shè)的輸出
f(整數(shù)):6
f(雙精度):6.6
說明:在這里,我們正在創(chuàng)建派生類的對象,因此編譯器將優(yōu)先考慮派生類,并在需要時執(zhí)行隱式類型轉(zhuǎn)換。因此,一旦編譯器到達(dá)Console.WriteLine(obj.f(3));?這行代碼將檢查參數(shù)兼容性。在這里,圖3是INT其與兼容雙的派生類函數(shù)f。因此,編譯器將執(zhí)行int到double的隱式類型轉(zhuǎn)換。因此,輸出f(double):6.3將會出現(xiàn)。
現(xiàn)在,當(dāng)編譯器運(yùn)行在Console.WriteLine(obj.f(3.3));處。,它將再次賦予派生類優(yōu)先級,并發(fā)現(xiàn)可調(diào)用。因此它將評估派生類函數(shù)f。因此,輸出f(double):6.6將會出現(xiàn)。
現(xiàn)在讓我們再來看一次將基類函數(shù)f放入派生類中的情況,反之亦然,如下所示:
輸出:
f(整數(shù)):6
f(雙精度):6.6
您對預(yù)期的輸出感到震驚嗎?這怎么可能?
好吧,我們對這些問題有一個答案。由于我們已經(jīng)創(chuàng)建了Derived類的對象,因此C#編譯器將優(yōu)先考慮derived,如果找不到任何兼容性,則將其用于基類。因此,當(dāng)編譯器位于Console.WriteLine(obj.f(3))時;的代碼行,它將檢查派生的類方法f,并發(fā)現(xiàn)可調(diào)用的,因此執(zhí)行此方法,并輸出f(int):6?,F(xiàn)在當(dāng)Console.WriteLine(obj.f(3.3));?這行代碼將執(zhí)行,將發(fā)現(xiàn)派生的類方法不適合作為3.3(double)
與int數(shù)據(jù)類型不兼容,因此編譯器現(xiàn)在將更喜歡基類,并且在那里找到最佳匹配并執(zhí)行該匹配。因此,該輸出為f(雙精度):6.6。
原因與C ++程序中說明的相同。像C ++一樣,在Base類和Derived類之間沒有重載解析。在C#中,沒有作用域之間的重載,派生類作用域也不是該一般規(guī)則的例外。這與C ++相同,因?yàn)镃#語言的創(chuàng)建者Anders hejlsberg認(rèn)為,C#的設(shè)計(jì)與C ++更加接近。
以上就是今天的全部內(nèi)容了。每日分享小知識,希望對你有幫助~
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
微信公眾號:C語言編程學(xué)習(xí)基地
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
