C 中的過載丶重寫丶重定義丶重定向的區別

2021-06-14 01:50:17 字數 1633 閱讀 7662

先看過載:

過載指的是函式的過載,又有成員函式和一般函式的過載,兩者沒什麼區別,只是地方不一樣而已

函式過載表示函式名相同,但是引數不同,函式過載在c語言裡面是沒有的,只限定在c++如下所示:

double  max(double x,double y),

int  max(int  x,int y);

這兩個函式就是過載的範例,那麼呼叫的時候編譯器是如何確定呼叫哪乙個勒?書本上一般說程式會根據引數型別識別呼叫哪乙個,其實那是忽悠人的

實際上在編譯期間,編譯器就已經把函式名字改變了,多加了一些字尾而已(當然說自動識別也不為過)

再看重寫:

函式重寫是發生在基類和派生類中的,基類和派生類函式名字必須相同,而且基類函式必須有virtual修飾符,結果是派生類函式覆蓋了基類函式,這在c++面向基於物件的程式設計中

已經非常熟悉了,多型就這樣出來了,如下:

base *p =  new child;

p-> display();

如果派生類重寫了display函式  在這裡就呼叫派生類的,否則呼叫基類的!

然後重定義

這個分兩種情況,也是發生在基類和派生類之間

第一種:基類函式不含有vistual修飾符,在派生類中有乙個與基類函式同名並且同引數的函式,這個時候基類函式在派生類中被遮蔽了,這種情況叫做一種重定義!

第二種:如果派生類的函式和基類的函式同名,但是引數不同,此時,不管有無virtual,基類的函式被隱藏。

我來解釋下第二種情況,有的人可能會說,我想的就是那樣啊,在派生類中寫乙個與基類函式名字相同,但是引數不同的函式,與繼承而來的基類函式構成過載!

相信很多新手會有這種想法(我當初也是),c++ primer上面對這個問題說了,如果是想過載從基類繼承而來的函式,必須手動的從基類複製該函式宣告到派生類中,至於什麼原因,我想又跟編譯器底層有關,這就不去深究了!

最後重定向

其實這個重定向跟函式扯不上關係了,只是跟前面幾個概念比較相似,他是在io流處理的時候被提到的。

在c語言中我們知道 乙個file指標關聯到乙個檔案之後,重定向只需要乙個freopen函式即可重新定位乙個新的檔案,這叫c語言的重定向

c++中,對流重定向有兩個過載函式:

streambuf* rdbuf () const;

streambuf* rdbuf (streambuf*)

如下:streambuf *backup;

ifstream fin;

fin.open("data.in");

backup = cin.rdbuf(); // back up cin's streambuf

cin.rdbuf(fin.rdbuf()); // assign file's streambuf to cin

// ... cin will read from file

cin.rdbuf(backup); // restore cin's original streambuf

注意最後我們使用了cin.rdbuf(backup)把cin又重定向回了控制台!

都快6點了,結束了一夜的學習,該睡覺了,頭有點懵了,拖著疲憊的身體寫出來,有些概念沒寫好請體諒!

C 中過載 重寫 重定義

過載 1 作用域相同。2 函式名相同,引數列表不同。3 與返回值無關。例 同乙個類的建構函式和拷貝建構函式構成過載。class a a const a a 重寫 覆蓋 1 不在同一作用域 分別為基類和派生類 2 函式名相同,引數列表相同,返回值相同。3 基類成員函式必須有virtual關鍵字修飾。4...

c 中的過載,重寫,重定義

c 中的幾個容易混淆的概念 1 過載 在同一作用域中,函式名相同,引數列表不同,返回值可同可不同的函式。關於函式過載的知識在 函式過載 這篇部落格中有詳細介紹。2 重寫 又叫覆蓋,是指不在同乙個作用域中 分別在父類和子類中 函式名,參 數個數,引數型別,返回值型別都相同,並且父類函式必須有virtu...

C 過載重寫重定義

includeusing namespace std 函式過載 必須在同乙個類中進行 子類無法過載父類的函式,父類同名函式將被名稱覆蓋 過載是在編譯期間根據引數型別和個數決定函式呼叫 函式重寫 必須發生於父類和子類之間 並且父類和子類中的函式必須有完全相同的原型 使用virtual宣告之後能夠產生多...