C++的多態總結(靜態&動態)


什么是多態

顧名思義就是同一個事物在不同場景下的多種形態。

靜態多態

我們以前說過的函數重載就是一個簡單的靜態多態,靜態多態是編譯器在編譯期間完成的,編譯器會根據實參類型來選擇調用合適的函數,如果有合適的函數可以調用就調,沒有的話就會發出警告或者報錯。

動態多態

動態多態:它是在程序運行時根據基類的引用(指針)指向的對象來確定自己具體該調用哪一個類的虛函數。

基類中必須包含虛函數,並且派生類中一定要對基類中的虛函數進行重寫。

通過基類對象的指針或者引用調用虛函數,因為派生類對基類中的虛函數進行重寫,使用派生類的虛函數替換相同偏移量位置的基類虛函數,如果派生類中新增加自己的虛函數,按照其在派生類中的聲明次序,放在上述虛函數之后 。

重寫 :

(a)基類中將被重寫的函數必須為虛函數(上面的檢測用例已經證實過了)

(b)基類和派生類中虛函數的原型必須保持一致(返回值類型,函數名稱以及參數列表),協變和析構函數(基類和派生類的析構函數是不一樣的)除外

(c)訪問限定符可以不同

那么問題又來了,什么是協變?

協變:基類(或者派生類)的虛函數返回基類(派生類)的指針(引用)

總結一道面試題:那些函數不能定義為虛函數?

1)友元函數,它不是類的成員函數

2)全局函數

3)靜態成員函數,它沒有this指針

4)構造函數,拷貝構造函數,以及賦值運算符重載(可以但是一般不建議作為虛函數)

動態多態缺陷

降低了程序運行效率(多態需要去找虛表的地址)
空間浪費(需要創建虛表,浪費空間)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM