先看重載:
重載指的是函數的重載,又有成員函數和一般函數的重載,兩者沒什麼區別,只是地方不一樣而已
函數重載表示函數名相同,但是參數不同,函數重載在C語言裡面是沒有的,只限定在C++如下所示:
double max(double x,double y),
int max(int x,int y);
這兩個函數就是重載的範例,那麼調用的時候編譯器是如何確定調用哪一個勒?書本上一般說程式會根據參數類型識別調用哪一個,其實那是忽悠人的
實際上在編譯期間,編譯器就已經把函數名字改變了,多加了一些尾碼而已(當然說自動識別也不為過)
比如上面兩個程式分別編譯為 max_double_double 和 max_int_int 當然這裡我只是表示一下,實際上不是這樣,如果要想看看名字,可以通過命令列定位到這個程式,百度上有教程,我就不累述了!
再看重寫:
函數重寫是發生在基類和衍生類別中的,基類和衍生類別函數名字必須相同,而且基類函數必須有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點了,結束了一夜的學習,該睡覺了,頭有點懵了,拖著疲憊的身體寫出來,有些概念沒寫好請體諒!