函式過載和覆蓋

2021-09-25 12:47:12 字數 1503 閱讀 2117

目錄

一、函式過載(重定義)

1、函式過載:

2、函式過載在c語言中為啥不能共存

3、c++中函式過載

4、函式過載的特點:(過載的三要素)

二、覆蓋

1、覆蓋函式:

2、覆蓋的特徵:

三、過載和覆蓋的區別

四、程式示例

過載是指函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(同名,引數型別、個數、順序不同)。

對於過載函式的呼叫,在編譯期間就已經確定,是靜態的,它們的位址在編譯期間就繫結了與多型無關。

(1)c語言沒有函式過載,過載是c++的內容

(2)c語言不能過載與函式編譯後函式名有關

編譯後函式名變化只是在原來的函式名前加了乙個下劃線,所以當同名的函式引數不同時,編譯器是無法解析到它們的不同, 因為它們編譯後的名稱都相同,所以c語言不能函式過載

(1)返回值   //無關  返回值不參與過載

過載決議:呼叫點和定義點進行匹配:型別匹配

呼叫點只能看到函式名和實參,返回值不能做呼叫點的依據,因此也不能做函式過載的依據

(2)函式名     //無關

?sum@@yahhh@z    int h      //函式符號生成不同

?sum@@yannn@z    double n

(3)形參:     //有關

引數個數

引數型別

引數資料

(1)同名

(2)不同參

(3)同作用域:      //c++有就近原則

覆蓋是指派生類中存在重新定義基類的函式,其函式名、引數列、返回值型別必須同父類中的相對應被覆蓋的函式嚴格一致,覆蓋函式和被覆蓋函式只有函式體不同,當派生類物件呼叫子類中該同名函式時會自動呼叫子類中的覆蓋版本,而不是父類中的被覆蓋函式版本,它和多型真正相關。

當子類重新定義了父類的虛函式後,父類指標根據賦給它不同的子類指標,動態地呼叫屬於子類地該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛函式的位址無法給出)。因此,這樣的函式位址是在執行期繫結的。

(1)不同的範圍(分別位於派生類和基類)

(2)函式名字相同

(3)引數相同

(4)基類函式必須有virtual關鍵字

1、覆蓋是子類和父類之間的關係,是垂直關係;過載是同乙個類中方法之間的關係,是水平關係

2、覆蓋只能由乙個方法,或只能由一對方法產生關係;方法的過載是多個方法之間的關係

3、覆蓋要求引數列表相同;過載要求引數列表不同

4、覆蓋關係中,呼叫方法體是根據物件的型別(對相對應儲存空間型別)來決定的;過載關係是根據呼叫時的實參表與形參表來選擇方法體的

#includeusing namespace std;

class base

(1)函式bse::f(int)與base::f(float)相互過載;

(2)base::g(void)與derived::g(void)覆蓋;

函式過載,覆蓋和隱藏

a.成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。b.覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有virtual 關鍵字。c.隱藏 是指派生類...

過載覆蓋多型和虛函式

現在整理出來,希望可以記住這個。函式的名稱一樣,但是引數不同,就是過載 函式的名稱知道了,但是編譯的時候不知道呼叫哪個函式,過載決議 根據引數決定到底應該呼叫哪個函式 區別就是 呼叫的引數不一樣 對於非虛函式,子類和基類同名 不管引數 那麼就是導致覆蓋 如果引數完全一樣,那麼會完全覆蓋,只會留下子類...

過載和覆蓋

方法的過載 方法名必須相同 引數個數或型別不同 對返回值不做要求,訪問許可權修飾符及final修飾符對過載也沒有影響。靜態方法和例項方法之間可以過載。方法的覆蓋 重寫 方法名必須相同 返回值資料型別必須完全相同 方法的引數必須完全相同,包括引數的個數 型別和順序。此外,子類方法的訪問許可權不能嚴於父...