程式語言中的重載
編程中重載的定義:函式名相同,函式的參數列表不同(包括參數個數和參數類型),至於返回類型可同可不同。
重載是可使函式、
運算符等處理不同類型數據或接受不同個數的參數的一種方法,關於重載一詞在詞義上有兩種不同的說法:
多態:
重載是一種多態(如C++,Java),有四種形式的多態:
2模板多態
3重載
4轉換
所謂的動態和靜態區分是另一種基於綁定時間的多態分類,嚴格來說,重載是編譯時多態,即靜態多態,根據不同類型函式編譯時會產生不同的名字如int_foo和char_foo等等,以此來區別調用。故重載仍符合多態定義——通過單一標識支持不同特定行為的能力,只是重載屬於靜態多態,而不是通過繼承和
虛函式實現的動態多態。
覆蓋:
重載(overloaded)和多態無關,真正和多態相關的是覆蓋(inheritance)。
當
派生類重新定義了基類的虛擬方法後,基類根據賦給它的不同的派生類引用,動態地調用屬於派生類的對應方法,這樣的方法調用在編譯期間是無法確定的。因此,這樣的方法地址是在運行期綁定的(
動態綁定)。
重載只是一種語言特性,是一種語法規則,與多態無關,與
面向對象也無關。
不過針對所謂的第二種重載,有一個專門的名詞--重寫或重定義。重載與重寫的區別就在於是否覆蓋,重寫一般多發生在不同的類且存在繼承關係之間,而重載多是在一個類里或者一塊代碼段里。
特點:
由於重載可以在同一個類中定義功能類似的函式,這給程式設計師管理類的相似函式提供了極大的方便。例如,在一個定義圓的類中,需要設定圓心和半徑來確定一個圓對象,程式設計師不需要設定setRadius(float r)和SetPoint(float x,float y)兩個不同名函式,而只需要設定一個CSetCicle函式名就夠了。在這個簡單的例子中重載並沒有明顯的優勢,可是當一個類中相似功能函式有幾十、上百個的時候,重載的優勢就顯現出來了,這時程式設計師不需要去記這么繁多的函式名,可以把更多的精力放在程式本身上。重載的方法只屬於子類。
函式:
1.函式名必須相同,返回值可以相同,也可以不同,但是特徵標必須不同。是函式名來確定函式的不同,是特徵標是函式可以重載。
編譯器首先選在函式名,然後再根據特徵標在眾多重載的函式中找到合適的。
2.匹配函式時,編譯器將不區分類型引用和類型本身,也不區分const和非const變數。(小註:因為這些在定義和聲明時可能不同,但是在調用時都是一樣的,編譯器將無法區分)。但是值得注意的是,
形參與const形參的等價性僅適於非引用形參。有const引用形參的函式與有非const引用形參的函式是不同的。類似的,如果函式帶有指向const類型的
指針形參,則與帶有指向相同類型的非const對象的指針形參的函式不相同。
3.名稱修飾(name decoration)。
編譯器將根據原型中指定的形參對每個函式名進行加密。
重定義:
被重載的函式有不同版本,這些函式地位是一樣的,可以根據特徵標的不同選擇不同的函式。被重定義的函式也有不同的版本,但是你不能隨意選擇,你只能選擇最新的版本,被重定義多發生在類之間的繼承里。
4.函式會有那么多版本,那么編譯將選哪一個呢。當然,理想情況是,實參與
形參的數據類型完全匹配,但是當不完全匹配時會怎樣呢?這就要牽扯到c++里複雜的類型轉換了。
第一步:創建候選函式列表,其中包含有與被調函式名稱相同的函式與模板函式。
第二步:使用候選函式列表創建可行函式列表。這些都是參數數目正確的函式。
第三步:確定是否有最佳可行的函式。如果有,則使用。
確定最佳函式,只考慮其特徵標,而不考慮返回類型(也無從考慮,但是要是硬想辦法的話,也有,不過沒有必要為了不必要的性能而浪費資源)。確定最佳函式,匹配特徵標要依次經過以下判斷:(1)完全匹配(常規函式優於模板;允許無關緊要的轉換)(2)提升匹配(如char和short自動轉換為int)(3)標準轉換(int轉換為char,long轉換為double)(4)用戶自定義的轉換(如類聲明中定義的
轉換函式)。
完全允許無關緊要的轉換,這些轉換包括引用,
指針與實體之間,
數組與指針之間,函式與
函式指針之間,const與非const等等。
其次還要注意匹配的優先權。1,指向非const數據的指針和引用優先於const的指針和
引用參數匹配(這種優先權只有當指針或引用出現時產生)。2,非模板函式,優於模板函式,顯示具體化的模板將優於隱式具體化的模板,總之較具體的優先(注意,具體並不是由於顯隱決定的,術語“最具體”是指
編譯器推斷使用哪種類型時執行的轉換最少)。
重寫
通常,
派生類繼承
基類的方法,因此,在調用對象繼承方法的時候,調用和執行的是基類的實現.但是,有時需要對派生類中的繼承方法有不同的實現.
例如,假設動物類存在"跑"的方法,從中派生出馬和狗,馬和狗的跑得形態是各不相同的,因此同樣方法需要兩種不同的實現,這就需要"重新編寫"基類中的方法.
"重寫"基類方法就是修改它的實現或者說在派生類中重新編寫
//java代碼//方法重寫public class Father{public void ovel(int i){/*do something...*/}public String ovef(){/*do something...*/return "***";}}public class Son extends Father{public void ovel(int i){/*do other something...*/}public String ovef(){/*do other something...*/return "XXX";}}
變壓器重載
連續負荷在變壓器容量80%到滿載的情況。
電氣行業通常稱呼的重載,實際上是重載連線器的簡稱,又名重載插座,廣泛套用於建築機械、紡織機械、包裝印刷機械、菸草機械、電力機車和石化電氣等需要進行電氣和信號連線的設備中。
重載連線器在結構設計、材料使用方面的國際先進性使得連線器在電氣性能方面表現突出。對於電氣連線系統的可靠性是傳統的連線方式無法達到的。