顯式接口,運行期多態(面向對象編程解決問題的方式)
顯式接口:我們知道它是什麼樣子,在源碼中明確可見。
虛函數:提供運行期多態支持,根據動態類型決定調用函數。
模板和泛型編程的重點是隱式接口和編譯期多態
看下面這個模板函數
[cpp] emplate<typename T>
void DoSometing(T& w)
{
if(w.size()>10&&w!=someNastWidge)
{
T temp(w);
temp.normalize();
temp.swap(w);
}
}
template<typename T>
void DoSometing(T& w)
{
if(w.size()>10&&w!=someNastWidge)
{
T temp(w);
temp.normalize();
temp.swap(w);
}
}1.函數內w所調用的函數就是一組隱式接口。單從代碼上看我們還不能確定w是什麼類型。但是T必須支持這些隱式接口。
2.由於參數T的種類可以多種多樣,這樣,在編譯期,T的具體類型的不同導致了函數體內w所調用的函數也不相同。這便是所謂的編譯期多態。
3.關於編譯期多態和運行期多態
編譯期多態和運行期多態可以簡單的理解成,一個是決定哪個重載函數該被調用(一般依據編譯器的函數重命名規則來實現,發生在編譯期),另一個是哪一個虛函數該被綁定(通過虛函數表和虛函數指針實現,發生在運行期,根據類中的虛函數指針來動態確定)。
4.關於顯式接口和隱式接口
顯式接口就是一個完整的函數簽名,明確指明了函數名稱,參數類型,返回值
隱式接口由一系列有效表達式組成。什麼意思呢
比如這樣一個表達式:
w.size()>10&&w!=someNastWidge
通過表達式來指明類型參數T具有哪些能力,這些便是隱式接口
牢記:
1.類和模板都支持接口和多態
2.對類而言,接口是顯式的(explicit)。多態是通過虛函數在運行期實現。
3.模板,接口是隱式的(implicit),是基於有效表達式的。多態是通過在編譯期,模板具體化和對函數重載的解析來實現。