從本條款開始,就進入了全書的第七部分:模板與泛型編程。模板與泛型在C++中是很是重要的部分,還記得本書第一章時,把C++視爲一個聯邦,它由四個州政府組成,其中一個政府就是模板與泛型了。編程
本條款是一個介紹性質的條款,內容不難,只須要講清楚兩個概念就好了,即什麼是隱式接口,什麼是編譯期多態。函數
隱式接口是相對於函數簽名所代碼的顯式接口而言的。當咱們看到一個函數簽名(即函數聲明),好比說:spa
string GetNameByStudentID(int StudentID); 指針
咱們就知道這個函數有一個整型的形參,返回值是string。code
但隱式接口是由有效表達式組成的,考慮一個模板函數,像下面這樣:對象
1 template <class T> 2 void TemplateFunction(T& w) 3 { 4 if(w.size() > 10){…} 5 }
T能夠是int,能夠double,也能夠是自定義的類型。光看這個函數聲明,咱們不能肯定T具體是什麼,但咱們知道,要想經過編譯,T必需要支持size()這個函數。也就是說,T中必定要有這樣的函數接口聲明。blog
ReturnValue size(); 繼承
固然返回值ReturnValue不必定是int了,只要它能支持operator > (ReturnValue, 10)這樣的運算便可。這種由表達式推判出來的函數接口,稱之爲隱式接口。接口
簡言之,顯式接口由函數簽名式構成,隱式接口由有效的表達式組成。編譯器
下面討論編譯期多態的問題,咱們在討論繼承時就已經屢次提到「運行時多態」了,它伴隨着virtual關鍵字,本質是一個虛表和虛指針,在類對象構造時,將虛指針指向了特定的虛表,而後運行時就會根據虛表的內容進行函數調用。
那麼「編譯期多態」又是什麼呢,從字面上來看,它發生在編譯階段,實際上就是template <class T>這個T的替換,它能夠被特化爲int,或者double,或者用戶自定義類型,這一切在編譯期就能夠決定下來T究竟是什麼,編譯器會自動生成相應的代碼(把T換成具體的類型),這就是編譯期多態作的事情了,它的本質能夠理解成自動生成特化類型版本,T能夠被替換成不一樣的類型,好比同時存在int版本的swap與double版本的swap,造成函數重載。簡言之,運行時多態是決定「哪個virtual函數應該被綁定」,而編譯期多態決定「哪個重載函數應該被調用」。
最後總結一下:
1. class和template都支持接口與多態;
2. 對classes而言,接口是顯式的,以函數簽名爲中心。多態則是經過virtual函數發生於運行期;
3. 對template參數而言,接口是隱式的,奠定於有效表達式。多態則是經過template具現化和函數重載解析發生於編譯期。