C 函式過載 函式重定義 以及函式重寫

2021-10-07 08:10:46 字數 3033 閱讀 4628

在c++的學習中,肯定免不了對一些概念的辨析,但往往很多時候,百思不得其解。問題的關鍵在於自己是否注意到了一些細節。

函式過載是什麼?

其實,我們大可以認為這是編譯器的一種機制,他會根據函式的相關特性來自動對你所呼叫的函式進行匹配,自動選擇匹配的函式,從而這種自動匹配選擇從而呼叫對應的函式的機制,我們就可以稱為函式過載。

怎麼樣能構成函式過載?

函式過載是指在乙個類中宣告多個名稱相同但引數列表不同的函式,這些的引數可能個數或順序,型別不同,但是不能靠返回型別來判斷。特徵是:

(1)相同的範圍(在同乙個作用域中);

(2)函式名字相同;

(3)引數不同;

(4)virtual 關鍵字可有可無(注:函式過載與有無virtual修飾無關);

注意:函式過載與返回值型別無關

下面,我就通過**的形式來對函式過載進行說明:(我這裡沒有利用類來進行講解,僅僅利用定義簡單函式來講解)

void

sum(

int a,

int b)

void

sum(

int a,

int b,

int c)

void

sum(

char a,

char b)

void

sum(

char a,

int b)

void

sum(

int a,

char b)

#include

using

namespace std;

//程式入口

intmain()

執行結果如圖:

通過執行的結果很顯然,大家可以觀察到,我明明呼叫的函式同名,但正是因為傳入實參的個數,型別,順序不同,它所呼叫的函式就不同,這就是過載。系統會根據你所傳入實參的型別,個數,以及順序,自動進行匹配,並呼叫相對應的函式,如果沒有與之匹配的函式,則報錯。

==注意:==我這裡指的並非vs編譯時,報錯內容為重定義,此重定義非彼重定義,這裡的重定義是指對函式進行重新的寫入。這裡我引用到類的概念了,如果大家對類的概念還不足夠了解,那可以先轉入其他的博主裡面先了解類的概念,從而再來對重定義以及重寫進行區分。

函式重定義是什麼

(1)不在同乙個作用域(分別位於派生類與基類) ;

(2)函式名字相同;

(3)返回值可以不同;

(4)引數不同。此時,不論有無 virtual 關鍵字,基類的函式將被隱藏(注意別與過載以及覆蓋混淆);

(5)引數相同,但是基類函式沒有 virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆);

#include

using

namespace std;

//基類

class

base

private:}

;//派生類ca繼承於base類

classca:

public base

private:}

;//派生類cb整合與base類

classcb:

public base

private:}

;//程式入口

intmain()

執行結果:

可以看到,原本基類base類中就存在了show()方法。

假定我沒有在派生類ca類去定義show方法,則類物件ca必然呼叫的是基類的成員方法,具體實現,可以直接注釋掉ca類裡面的show方法,執行即可,我就不在這裡實現了。

但是在這,我在派生類ca中去重定義了show方法,因此呢就隱藏了基類的show方法那麼類物件ca就會呼叫自己重寫後的show方法,所以類物件ca呼叫的是ca類的show方法。

其次,cb類也對show方法進行了重寫,所以也隱藏了基類show方法,此時cb的類物件cb就無法呼叫無參的show方法了,cb只能呼叫自身重定義後的show(int i)的方法了。

這就是函式重定義

函式重寫是指子類重新定義基類的虛函式。特徵是:

(1)不在同乙個作用域(分別位於派生類與基類);

(2)函式名字相同;

(3)引數相同;

(4)基類函式必須有 virtual 關鍵字,不能有 static 。

(5)返回值相同,否則報錯;

(6)重寫函式的訪問修飾符可以不同;

過載與覆蓋的區別:

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

(2)覆蓋要求引數列表相同,過載要求引數列表不同;覆蓋要求返回型別相同,過載則不要求;

(3)覆蓋關係中,呼叫方法體是根據物件的型別(基類型別還是派生類型別)來決定的,過載關係是根據呼叫時的實參表與形參表來選擇方法體的。

#include

using

namespace std;

//基類

class

base

private:}

;//派生類

classca:

public base

private:}

;//程式入口

intmain()

執行結果:

注意:覆蓋關係中,呼叫方法體是根據物件的型別(基類型別還是派生類型別)來決定的,過載關係是根據呼叫時的實參表與形參表來選擇方法體的。

也就是說:呼叫函式時,是呼叫哪個函式,需要看類物件的型別。如果該類物件的型別為基類,則呼叫基類的成員函式,如果該類物件的型別為派生類,並且派生類對基類的成員函式進行了重寫,則該派生類的類物件就會呼叫自己重寫後的同名成員函式。

函式宣告錯誤以及函式重定義

1.在標頭檔案宣告中出現錯誤 void to report lol data detail std map std string std string ojb error c2039 string 不是 std 的成員 error c2065 string 未宣告的識別符號 error c2065 ...

C 函式重定義 過載 重寫

c 的重寫,過載,重定義 1.重寫 override 又稱覆蓋 父類與子類之間的多型性。子類重新定義父類中有相同名稱和引數的虛函式。1 被重寫的函式不能是 static 的。必須是 virtual 的,或者是 override 的 即函式在最原始的基類中被宣告為 virtual c 中沒有 over...

C 函式過載 重寫 重定義

c 中經常會提到過載,除了過載,還有重寫,重定義,下面對這三個概念逐一進行區分 1 過載 函式過載是同一定義域中 即同乙個類中 的同名函式,但形參的個數必須不同,包括引數個數,型別和順序,不能僅通過返回值型別的不同來過載函式 include using namespace std class box...