C++中的重載丶重寫丶重定義丶重新導向的區別

來源:互聯網
上載者:User

先看重載:

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.