什么是多態
顧名思義就是同一個事物在不同場景下的多種形態。
靜態多態
我們以前說過的函數重載就是一個簡單的靜態多態,靜態多態是編譯器在編譯期間完成的,編譯器會根據實參類型來選擇調用合適的函數,如果有合適的函數可以調用就調,沒有的話就會發出警告或者報錯。
動態多態
動態多態:它是在程序運行時根據基類的引用(指針)指向的對象來確定自己具體該調用哪一個類的虛函數。
基類中必須包含虛函數,並且派生類中一定要對基類中的虛函數進行重寫。
通過基類對象的指針或者引用調用虛函數,因為派生類對基類中的虛函數進行重寫,使用派生類的虛函數替換相同偏移量位置的基類虛函數,如果派生類中新增加自己的虛函數,按照其在派生類中的聲明次序,放在上述虛函數之后 。
重寫 :
(a)基類中將被重寫的函數必須為虛函數(上面的檢測用例已經證實過了)
(b)基類和派生類中虛函數的原型必須保持一致(返回值類型,函數名稱以及參數列表),協變和析構函數(基類和派生類的析構函數是不一樣的)除外
(c)訪問限定符可以不同
那么問題又來了,什么是協變?
協變:基類(或者派生類)的虛函數返回基類(派生類)的指針(引用)
總結一道面試題:那些函數不能定義為虛函數?
1)友元函數,它不是類的成員函數
2)全局函數
3)靜態成員函數,它沒有this指針
4)構造函數,拷貝構造函數,以及賦值運算符重載(可以但是一般不建議作為虛函數)
動態多態缺陷
降低了程序運行效率(多態需要去找虛表的地址)
空間浪費(需要創建虛表,浪費空間)