C/C++基础语法复习(三):C++重载函数,多态,虚函数
?
1.重載運(yùn)算符和重載函數(shù):
C++ 允許在同一作用域中的某個(gè)函數(shù)和運(yùn)算符指定多個(gè)定義,分別稱為函數(shù)重載和運(yùn)算符重載。
重載聲明是指一個(gè)與之前已經(jīng)在該作用域內(nèi)聲明過的函數(shù)或方法具有相同名稱的聲明,但是它們的參數(shù)列表和定義(實(shí)現(xiàn))不相同。
當(dāng)您調(diào)用一個(gè)重載函數(shù)或重載運(yùn)算符時(shí),編譯器通過把您所使用的參數(shù)類型與定義中的參數(shù)類型進(jìn)行比較,決定選用最合適的定義。
選擇最合適的重載函數(shù)或重載運(yùn)算符的過程,稱為重載決策。
?
a.函數(shù)重載:
在同一個(gè)作用域內(nèi),可以聲明幾個(gè)功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(指參數(shù)的個(gè)數(shù)、類型或者順序)必須不同。您不能僅通過返回類型的不同來重載函數(shù)。
?
b.運(yùn)算符重載:
您可以重定義或重載大部分 C++ 內(nèi)置的運(yùn)算符。這樣,您就能使用自定義類型的運(yùn)算符。
重載的運(yùn)算符是帶有特殊名稱的函數(shù),函數(shù)名是由關(guān)鍵字 operator 和其后要重載的運(yùn)算符符號(hào)構(gòu)成的。與其他函數(shù)一樣,重載運(yùn)算符有一個(gè)返回類型和一個(gè)參數(shù)列表。
詳細(xì)例子:https://www.runoob.com/cplusplus/cpp-overloading.html
?
2.多態(tài):
多態(tài)按字面的意思就是多種形態(tài)。當(dāng)類之間存在層次結(jié)構(gòu),并且類之間是通過繼承關(guān)聯(lián)時(shí),就會(huì)用到多態(tài)。
C++ 多態(tài)意味著調(diào)用成員函數(shù)時(shí),會(huì)根據(jù)調(diào)用函數(shù)的對(duì)象的類型來執(zhí)行不同的函數(shù)。
例子:https://www.runoob.com/cplusplus/cpp-polymorphism.html
?
文字版解釋:
假設(shè)我們有個(gè)基類叫shape,成員函數(shù)area,而其兩個(gè)子類的成員函數(shù)也有area(同名)。
如果你想調(diào)用兩個(gè)子類的函數(shù)area時(shí)候會(huì)發(fā)現(xiàn)程序仍然會(huì)調(diào)用shape(父類)的area函數(shù)。
導(dǎo)致錯(cuò)誤輸出的原因是,調(diào)用函數(shù) area() 被編譯器設(shè)置為基類中的版本,這就是所謂的靜態(tài)多態(tài),或靜態(tài)鏈接?- 函數(shù)調(diào)用在程序執(zhí)行前就準(zhǔn)備好了。有時(shí)候這也被稱為早綁定,因?yàn)?area() 函數(shù)在程序編譯期間就已經(jīng)設(shè)置好了。
解決辦法就是 基類 的area函數(shù)聲明改成??
virtualintarea(){
}
此時(shí),編譯器看的是指針的內(nèi)容,而不是它的類型。因此,由于 tri 和 rec 類的對(duì)象的地址存儲(chǔ)在 *shape 中,所以會(huì)調(diào)用各自的 area() 函數(shù)。
正如您所看到的,每個(gè)子類都有一個(gè)函數(shù) area() 的獨(dú)立實(shí)現(xiàn)。這就是多態(tài)的一般使用方式。有了多態(tài),您可以有多個(gè)不同的類,都帶有同一個(gè)名稱但具有不同實(shí)現(xiàn)的函數(shù),函數(shù)的參數(shù)甚至可以是相同的。
?
虛函數(shù)?:
是在基類中使用關(guān)鍵字?virtual?聲明的函數(shù)。在派生類中重新定義基類中定義的虛函數(shù)時(shí),會(huì)告訴編譯器不要靜態(tài)鏈接到該函數(shù)。
我們想要的是在程序中任意點(diǎn)可以根據(jù)所調(diào)用的對(duì)象類型來選擇調(diào)用的函數(shù),這種操作被稱為動(dòng)態(tài)鏈接,或后期綁定。
?
純虛函數(shù):
您可能想要在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對(duì)象,但是您在基類中又不能對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn),這個(gè)時(shí)候就會(huì)用到純虛函數(shù)。
virtualintarea()=0;
純虛函數(shù)一定沒有定義,純虛函數(shù)用來規(guī)范派生類的行為,即接口。包含純虛函數(shù)的類是抽象類,抽象類不能定義實(shí)例,但可以聲明指向?qū)崿F(xiàn)該抽象類的具體類的指針或引用。
?C++中, 虛函數(shù)可以為private, 并且可以被子類覆蓋(因?yàn)樘摵瘮?shù)表的傳遞),但子類不能調(diào)用父類的private虛函數(shù)。虛函數(shù)的重載性和它聲明的權(quán)限無關(guān)。
一個(gè)成員函數(shù)被定義為private屬性,標(biāo)志著其只能被當(dāng)前類的其他成員函數(shù)(或友元函數(shù))所訪問。而virtual修飾符則強(qiáng)調(diào)父類的成員函數(shù)可以在子類中被重寫,因?yàn)橹貙懼畷r(shí)并沒有與父類發(fā)生任何的調(diào)用關(guān)系,故而重寫是被允許的。
編譯器不檢查虛函數(shù)的各類屬性。被virtual修飾的成員函數(shù),不論他們是private、protect或是public的,都會(huì)被統(tǒng)一的放置到虛函數(shù)表中。對(duì)父類進(jìn)行派生時(shí),子類會(huì)繼承到擁有相同偏移地址的虛函數(shù)表(相同偏移地址指,各虛函數(shù)相對(duì)于VPTR指針的偏移),則子類就會(huì)被允許對(duì)這些虛函數(shù)進(jìn)行重載。且重載時(shí)可以給重載函數(shù)定義新的屬性,例如public,其只標(biāo)志著該重載函數(shù)在該子類中的訪問屬性為public,和父類的private屬性沒有任何關(guān)系!
純虛函數(shù)可以設(shè)計(jì)成私有的,不過這樣不允許在本類之外的非友元函數(shù)中直接調(diào)用它,子類中只有覆蓋這種純虛函數(shù)的義務(wù),卻沒有調(diào)用它的權(quán)利。
引用:https://www.runoob.com/cplusplus/cpp-polymorphism.html
如果你正在學(xué)習(xí)C/C++編程知識(shí),感覺C/C++編程知識(shí)有困難的話,歡迎來和博主一起交流:C++編程
總結(jié)
以上是生活随笔為你收集整理的C/C++基础语法复习(三):C++重载函数,多态,虚函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2005年度国产空间信息系统软件测评工作
- 下一篇: 做一个中国式站长必须知道的五十个问题