靜態多態
和動態多態
,或者說是編譯期多態
和運行時多態
。模板
的機制實現靜態多態重載
和虛函數
的機制實現靜態多態和動態多態不能夠,由於inline函數沒有地址,沒法將他存放到虛函數表中。c++
不能,由於靜態成員函數中沒有this指針,使用::的調用方式沒法訪問虛函數表,因此靜態成員函數沒法放進虛函數表。編程
不能夠,由於對象中的虛函數指針是在對象構造的時候初始化的。數組
cppreference:一條有用的方針是,任何基類的析構函數必須爲公開且虛,或受保護且非虛
這個問題也就是說,是否應該容許指向基類的指針進行銷燬派生類對象?若是是,則base的析構函數必須是公共的才能被調用,不然虛擬調用它會致使未定義的行爲。不然,應該對其進行保護,以便只有派生類才能在本身的析構函數中調用它,這個析構函數也應該是非虛的,由於它不須要虛擬地運行。函數
若是是普通對象,是同樣快的,若是是指針對象或者是引用對象,調用普通函數更快一些,由於構成了多態,運行時調用虛函數要先到虛函數表中去查找。這樣而後纔拿到函數的地址,這樣就不如直接能夠拿到函數地址的普通函數快。this
當類中聲明瞭虛函數是,編譯器會在類中生成一個虛函數表VS中存放在代碼段,虛函數表實際上就是一個存放虛函數指針的指針數組,是由編譯器自動生成並維護的。虛表是屬於類的,不屬於某個具體的對象,一個類中只須要有一個虛表便可。同一個類中的全部對象使用同一個虛表,爲了讓每一個包含虛表的類的對象都擁有一個虛表指針,編譯器在每一個對象的頭添加了一個指針,用來指向虛表,而且這個指針的值會自動被設置成指向類的虛表,每個virtaul函數的函數指針存放在虛表中,若是是單繼承,先將父類的虛表添加到子類的虛表中,而後子類再添加本身新增的虛函數指針,可是在VS編譯器中咱們一般看不到新添加的虛函數指針,是編譯器故意將他們隱藏起來,若是是多繼承,在子類中新添加的虛函數指針會存放在第一個繼承父類的虛函數表中。指針
靜態綁定的多態的是經過函數的重載來實現的。動態綁定的多態是經過虛函數實現的。code
在不少狀況下由基類生成對象是很不合理的,純虛函數在基類中是沒有定義的,要求在子類必須加以實現,這種包含了純虛函數的基類被稱爲抽象類,不能被實例化,若是子類沒有實現純虛函數,那麼它他也是一個抽象類。對象
純虛函數不在基類裏實現,必需要在派生類裏重寫。
非純虛函數,能夠在基類實現,派生類能夠實現,也能夠不重寫
虛函數既繼承接口的同時也繼承了基類的實現,純虛函數關注的是接口的統一性,實現徹底由子類來完成。繼承