先看過載:
過載指的是函式的過載,又有成員函式和一般函式的過載,兩者沒什麼區別,只是地方不一樣而已
函式過載表示函式名相同,但是引數不同,函式過載在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宣告之後能夠產生多...