重載

編程中重載的定義:函數名相同,函數的參數列表不同(包括參數個數和參數類型),至于返回類型可同可不同。
重載是可使函數、運算符等處理不同類型數據或接受不同個數的參數的一種方法,關于重載一詞在詞義上有兩種不同的說法:
多態:
重載是一種多態(如C++,Java),有四種形式的多態:
1.虛函數多態
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,非模板函數,優于模板函數,顯示具體化的模板將優于隱式具體化的模板,總之較具體的優先(注意,具體并不是由于顯隱決定的,術語“最具體”是指編譯器推斷使用哪種類型時執行的轉換最少)。
重寫
通常,派生類繼承基類的方法,因此,在調用對象繼承方法的時候,調用和執行的是基類的實現.但是,有時需要對派生類中的繼承方法有不同的實現.
例如,假設動物類存在"跑"的方法,從中派生出馬和狗,馬和狗的跑得形態是各不相同的,因此同樣方法需要兩種不同的實現,這就需要"重新編寫"基類中的方法.
"重寫"基類方法就是修改它的實現或者說在派生類中重新編寫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
?? ?
//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";
}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450350.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450350.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

11. Container With Most Water

題意 給定n個非負整數\(a_1,a_2,...,a_n\),其中每個數表示坐標點\((i,a_i)\),i是數組下標,\(a_i\)是對應高度.尋找兩條線,使得兩條線構成的長方形面積最大,盛水最多. Example: Input: [1,8,6,2,5,4,8,3,7] Output: 49 解 暴力破解 對每種情況進行循環,計算對應的面積,同時保存最…

如何培養編程所需要的邏輯思維?

很少有人能單單通過所謂“邏輯思維”從復雜問題快速找到抽象的,如果有這樣的人,他的經驗,工具,方法和直覺通常起到比邏輯思維更重要的作用。寫代碼需要邏輯思維,但解決復雜問題更需要理解分析,寫代碼只是解…

jws 方式表格導出,excel文件導出,rest風格接口實現

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、思路:從數據庫表中查出list ,封裝到 HSSFWorkook 中,再由HSSFWorkook 寫出到 File 中, 用 res…

先思再行 閉著眼睛編程

摘要:解決問題最重要的習慣不是一直盯著屏幕和編寫修改代碼,某些時候,阻止你成功的東西恰恰會是過于努力。這時候你需要暫停一下,平緩你的思緒,換一種方法或許能帶給你不一樣的效果。你會花多少時間思考如何編寫代碼&a…

javaScript復習

ES6字符串方法: //console.log(String.prototype);var str "abcdefabc";//console.log(str.includes("a"));//結果true//console.log(str.includes("abf"));//結果false//console.log(str.startsWith("d"));//false//cons…

STS的安裝教程-鵬鵬

STS全稱Spring Tools Suite。 簡介:Spring Tools Suite (STS)其實就是一個被包裝過的Eclipse,主要用于快速的開發Spring項目,我們不用再去編輯繁瑣的xml配置文件,而是由工具自動生成。STS有兩種安裝方式,一種是直接在E…

final的用法

final 根據程序上下文環境,Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出于兩種理解而需要阻止改變:設計或效率。 final類不能被繼承,沒有子類,f…

愛恨交織的編程語言 是什么吸引了你

摘要:每門編程語言都有自身獨特的地方,那么為什么有些語言會一直存活在我們周圍,而有些語言卻逐漸被人淡忘,是什么吸引你? 每名程序員至少知道兩門以上的編程語言,有些甚至不是所謂的編程語言(比…

Unable to parse the date: 2017-12-30 日期格式轉化失敗

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯如題, 日期格式轉化失敗。 原因:參數是2017-09-23 這種格式,代碼卻是寫的轉為: &qu…

linux邏輯卷管理

2019獨角獸企業重金招聘Python工程師標準>>> 摘要: Linux用戶安裝Linux操作系統時遇到的一個最常見的難以決定的問題就是如何正確地給評估各分區大小,以分配合適的硬盤空間。而遇到出現某個分區空間耗盡時,解決的方法通常是使用符…

[LeedCode]921. 使括號有效的最少添加

題目描述: 給定一個由 ( 和 ) 括號組成的字符串 S,我們需要添加最少的括號( ( 或是 ),可以在任何位置),以使得到的括號字符串有效。從形式上講,只有滿足下面幾點之一,括號字符串才是…

abstract的一些用法

abstract(抽象)修飾符,可以修飾類和方法 1,abstract修飾類,會使這個類成為一個抽象類,這個類將不能生成對象實例,但可以做為對象變量聲明的類型,也就是編譯…

github 如何設置項目的語言顯示

github 會根據一個項目文件最多的那個種類的文件顯示為對應的語言項目 如果想讓整個項目顯示為 HTML 項目, 需要進行以下步驟的設置 1.在根目錄下創建一個文件 .gitattributescreate .gitattributes2.在 .gitattributes 內編輯以下內容: *.js linguist-languageHTML…

C++提高進階,你知道多少?

C從零開始 ——何謂編程 引言 曾經有些人問我問題,問得都是一些很基礎的問題,但這些人卻已經能使用VC編一個對話框界面來進行必要的操作或者是文檔/視界面來實時接收端口數據并動態顯示曲線(還使用了多線程技術),卻連…

POJ 3352 Road Construction ; POJ 3177 Redundant Paths (雙聯通)

這兩題好像是一樣的,就是3177要去掉重邊。 但是為什么要去重邊呢??????我認為如果有重邊的話,應該也要考慮在內才是。 這兩題我用了求割邊,在去掉割邊,用DFS縮…

postman界面變成了左右結構怎么辦

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 在左上角 file -- settongs中設置一下:

面向對象階段個人總結

面向對象階段的個人總結 我個人對面相對向的總結。我想到了我認為比較好的方法,就是對照每次學習一個大模塊的前的章節目錄進行回顧總結,比如我們這階段學習是面向對象的課程,下面我就來按照章節 目錄進行一個系統…

1.springboot:入門程序

一、Spring Boot 簡介 官網英文: Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. We take an opinionated view of the Spring platform and third-party libraries so you can get st…

2018.12.18運算符,分支結構(循環),異常處理,函數

1復習 <!DOCTYPE html><html><head> <meta charset"UTF-8"> <title>復習預習</title> <style> .b { /* 作用域: {}產生的, {作用域開始的標識, }作用域結束的標識 */ /*出現在作用域中的所有內…

javax.ws.rs.NotSupportedException: Cannot consume content type

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff1a;javax.ws.rs.NotSupportedException: Cannot consume content type 解決&#xff1a;使用postman發送 post 請求訪…