大家都知道面向對象程序設計有三個特點:封裝、繼承、多態。多態在面向對象程序設計中起著舉足輕重的作用。
上述的多態是如何實現的呢?通常是有一個基類,它包含了一些特定的接口,而該類的子類重載了這些接口;使用基類的指針或者引用指向子類的對象,那麼就可以實現調用子類對應的函數的功能;此種現象被稱為多態。
上述多態有哪些特點呢?
1.它是綁定的。即有一個基類,其中存在一些接口,子類必須重載這些接口,這就是綁定的。
2.它是動態的。這些函數調用機制是執行期才能進行確定,所以是動態的。
具有上述兩種特性的多態我們可以給它個新的名稱,動多態。那麼是否存在一種多態叫靜多態?確實有靜多態。
我想大家肯定已經猜到了靜多態的特點了:
1.它是非綁定的:因為采用模板機制,所以沒有所謂的基類,所以就不需要綁定。
2.它是靜態的:因為不采用虛函數機制,所以所有調用在編譯期就可確定,所以是靜態的。
靜多態如何實現呢?
Class Circle
{
Public:
Void Draw() const
{
Cout<<” Circle Draw”<<endl;
}
}
Class Line
{
Public:
Void Draw() const
{
Cout<<” Line Draw”<<endl;
}
}
Template<typename T>
Void DrawGeoObj(T const & obj)
{
Obj.Draw();
}
Int main(int *argc, char *argv[])
{
Circle c1;
Line l1;
DrawGeoObj(c1);// A
DrawGeoObj(l1);// B
}
此時A、B兩句即可以認為是靜多態。
此時您可能認為這根本不是什麼多態,只不過是模板函數罷了。那麼好吧,我再舉一個例子。
我們知道在橋模式(參見《設計模式》一書)中所說橋模式一般采用如下的方式實現:
而如果采用模板的方式那就會很簡單:
Template<typename T>
Class Interface
{
Private:
T body;
Public:
…
}
只需要傳遞不同的參數implementation A或者implementation B就可以了。
我好像聽到你說“但是…”,是的采用這種方式實現橋模式之後有它的好處也有它的缺點。不過通過這個例子使我們多了一種選擇,那就是靜多態。
經過上面的說明和舉例,我想大家已經基本明白什麼是靜多態了。我再一次強調把上面那種類似我們通常理解的多態的實現方法稱為靜多態。
靜多態有以下優點:
1.類型安全的。因為會在編譯期進行代碼的檢查,所以比動多態要安全。
2.效率要高。因為不需要執行期的決議,所以效率比較高。
靜多態有以下缺點:
1.不能夠處理異類的集合。
2.沒有動多態靈活(在上面橋靜多態實現的橋模式中不能夠動態改變實現)。
我們可以結合動多態和靜多態來獲得一個很好的效率和靈活性。
以上內容基本上來自於一本講述模板的書籍,歡迎大家指正和批評。