C/C++基礎語法複習(三):C++重載函數,多態,虛函數

 

1.重載運算符和重載函數:

C++ 允許在同一作用域中的某個函數和運算符指定多個定義,分別稱爲函數重載和運算符重載。

重載聲明是指一個與之前已經在該作用域內聲明過的函數或方法具有相同名稱的聲明,但是它們的參數列表和定義(實現)不相同。

當您調用一個重載函數或重載運算符時,編譯器通過把您所使用的參數類型與定義中的參數類型進行比較,決定選用最合適的定義。

選擇最合適的重載函數或重載運算符的過程,稱爲重載決策。

 

a.函數重載:

在同一個作用域內,可以聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同。您不能僅通過返回類型的不同來重載函數。

 

b.運算符重載:

您可以重定義或重載大部分 C++ 內置的運算符。這樣,您就能使用自定義類型的運算符。

重載的運算符是帶有特殊名稱的函數,函數名是由關鍵字 operator 和其後要重載的運算符符號構成的。與其他函數一樣,重載運算符有一個返回類型和一個參數列表。

詳細例子:https://www.runoob.com/cplusplus/cpp-overloading.html

 

2.多態:

多態按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多態。

C++ 多態意味着調用成員函數時,會根據調用函數的對象的類型來執行不同的函數。

例子:https://www.runoob.com/cplusplus/cpp-polymorphism.html

 

文字版解釋:

假設我們有個基類叫shape,成員函數area,而其兩個子類的成員函數也有area(同名)。

如果你想調用兩個子類的函數area時候會發現程序仍然會調用shape(父類)的area函數。

導致錯誤輸出的原因是,調用函數 area() 被編譯器設置爲基類中的版本,這就是所謂的靜態多態,或靜態鏈接 - 函數調用在程序執行前就準備好了。有時候這也被稱爲早綁定,因爲 area() 函數在程序編譯期間就已經設置好了。

解決辦法就是 基類 的area函數聲明改成  

virtualintarea(){

}

此時,編譯器看的是指針的內容,而不是它的類型。因此,由於 tri 和 rec 類的對象的地址存儲在 *shape 中,所以會調用各自的 area() 函數。

正如您所看到的,每個子類都有一個函數 area() 的獨立實現。這就是多態的一般使用方式。有了多態,您可以有多個不同的類,都帶有同一個名稱但具有不同實現的函數,函數的參數甚至可以是相同的。

 

虛函數 :

是在基類中使用關鍵字 virtual 聲明的函數。在派生類中重新定義基類中定義的虛函數時,會告訴編譯器不要靜態鏈接到該函數。

我們想要的是在程序中任意點可以根據所調用的對象類型來選擇調用的函數,這種操作被稱爲動態鏈接,或後期綁定。

 

純虛函數:

您可能想要在基類中定義虛函數,以便在派生類中重新定義該函數更好地適用於對象,但是您在基類中又不能對虛函數給出有意義的實現,這個時候就會用到純虛函數。

virtualintarea()=0;

純虛函數一定沒有定義,純虛函數用來規範派生類的行爲,即接口。包含純虛函數的類是抽象類,抽象類不能定義實例,但可以聲明指向實現該抽象類的具體類的指針或引用。

 C++中, 虛函數可以爲private, 並且可以被子類覆蓋(因爲虛函數表的傳遞),但子類不能調用父類的private虛函數。虛函數的重載性和它聲明的權限無關。

一個成員函數被定義爲private屬性,標誌着其只能被當前類的其他成員函數(或友元函數)所訪問。而virtual修飾符則強調父類的成員函數可以在子類中被重寫,因爲重寫之時並沒有與父類發生任何的調用關係,故而重寫是被允許的。

編譯器不檢查虛函數的各類屬性。被virtual修飾的成員函數,不論他們是private、protect或是public的,都會被統一的放置到虛函數表中。對父類進行派生時,子類會繼承到擁有相同偏移地址的虛函數表(相同偏移地址指,各虛函數相對於VPTR指針的偏移),則子類就會被允許對這些虛函數進行重載。且重載時可以給重載函數定義新的屬性,例如public,其只標誌着該重載函數在該子類中的訪問屬性爲public,和父類的private屬性沒有任何關係!

純虛函數可以設計成私有的,不過這樣不允許在本類之外的非友元函數中直接調用它,子類中只有覆蓋這種純虛函數的義務,卻沒有調用它的權利。

引用:https://www.runoob.com/cplusplus/cpp-polymorphism.html

如果你正在學習C/C++編程知識,感覺C/C++編程知識有困難的話,歡迎來和博主一起交流:C++編程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章