動多態:使用繼承、虛函數,基類指針實現透明地處理不同類型集合的方法(運行時多態)
靜多態:使用模板參數對不同類型集合實現透明地處理的方法(編譯時期多態) 二、動多態:通過繼承實現的多態是綁定和動態的。 綁定的含義是:對於參與多態行為的類型,他們(具有多態行為)的接口是在公共基類的設計中就預先確定了的(有時候也把這個綁定的概念稱為入侵式或者插入式的) 動態的含義是:接口在運行期動態的被綁定 三、靜多態:通過模板實現的多態是非綁定的和靜態的 非綁定的含義是:對於參與多態行為的類型,他們是相互獨立的,沒有必要用基類將他們聯系起來,也沒有必要在基類中事先預定公共接口,只要在這個集合中大家約定好接口的名稱就好了。(有的時候也稱這個概念為非入侵式或者非插入式) 靜態的含義是:接口在編譯時期完成綁定。 【編者感悟】什麼是入侵式什麼是非入侵式?如果現在我們需要增加一個新的多態類型的接口,動多態就需要在基類中提供這一接口的聲明(如果是純函數,那麼其子類也需要跟著一起修改添加聲明和定義)甚至是定義,這就需要“入侵”到基類,修改基類的公共接口規范!如果是靜多態,那我們就可以畫出一個子集,只是在需要這一新的公共接口的類型的集合中添加這一接口的聲明或者定義,而不必修改到其他未參與的類型的接口規范。 四、動多態優點 (1)能夠優雅的處理一個包含有不同類型的集合。 (2)可執行代碼量通常比較小(相比於模板實現的靜多態,為了處理不同的類型,必須生成多個不同的模板實例) (3)可以對代碼進行完全編譯;因此不需要發布源碼(如果是分發模板庫通常需要分發模板的源碼) 五、靜多態優點 (1)可以很容易的實現內建類型的集合。並不需要通過公共基類來表達接口的共同性 (2)所生成的代碼效率會比較高(因為不存在通過指針的剪接引用,而且可以進行演繹的廢墟你函數具有更多的內聯機會) (3)對於只提供了部分接口的具體類型,如果只是在程序中使用這一部分接口,那麼也可以使用該具體類型,而不必在乎該具體類型是否提供了其他部分接口。(如果是動多態,基類的公共接口通常設計成純虛函數,那麼在子類的具體類中就需要全部實現這些函數的定義) 通常而言,靜多態具有更好的類型安全性,因為靜多態在編譯期間會對所有的綁定做檢查。 六、泛型程序設計 泛型程序設計師計算機科學的一個分支,他運用自身系統的組織,來找到高效的算法,數據結構和其他軟件的概念的抽象表達,以及它們系統化的組織方式。泛型程序設計主要著重於表示一組相關領域概念。 泛型程序設計最著名的貢獻就是STL(Standard Template Library)。STL實際是一個框架,它提供了很多游泳的操作,我們也把這些操作稱之為是算法。他也為我們提供了很多線性的數據結構,我們把這些數據結構稱之為容器。而且算法和容器都是模板。、 ①算法不是容器的成員函數 ②為了讓容器使用這些算法 STL使用了一個叫做“迭代器”的概念。從本質上講,容器針對集合方面的操作都被外包到迭代器功能上了。 template<class Iterator> Iterator max_element(Iterator beg. Iterator end) { //使用迭代器來遍歷集合的所有元素 } namespace std{ template <class T, 。。。> class vector{ public: typedef ... const_iterator; const_iterator begin() const; const_iterator end() const; }; termplate <class T,。。。> class list{ public: typedef ...const_iterator; ... const_iterator begin() const; const_iterator end() const; }; } #include <vector> #include <list> #include<algorithm> #include <iostream> template<typename T> void print_max(T const& coll) { typename T::const_iterator pos; pos = std::max_element(coll.begin(), coll.end()); if(pos != coll.end()){ std::cout << *pos << std::endl; //可見迭代器其實很像指針 }else{ std::cout << "empty" << std::endl; } } int main() { std::vector<MyClass> c1; std::vector<MyClass> c2; print_max(c1); print_max(c2); return 0; } 編輯整理:Claruarius,轉載請注明出處。