天天看點

C++中的重載丶重寫丶重定義丶重定向的差別

先看重載:

重載指的是函數的重載,又有成員函數和一般函數的重載,兩者沒什麼差別,隻是地方不一樣而已

函數重載表示函數名相同,但是參數不同,函數重載在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點了,結束了一夜的學習,該睡覺了,頭有點懵了,拖着疲憊的身體寫出來,有些概念沒寫好請體諒!