C++中的多態分爲動多態和靜多態。
動多態是通過繼承和虛函數來實現的,這兩個機制都是在運行期進行處理的。平常所談論的C++多態指的就是這種動多態。
模板也允許使用單一的泛型標記來關聯不同的特定行爲,這種藉助於模板的關聯是在編譯器進行處理的,因此把這種多態稱爲靜多態。
一、動多態
動多態的設計思想主要在於:對於幾個相關對象的類型,確定它們之間的一個共同功能集,然後在基類中,把這些共同的功能聲明爲多個虛函數接口。
動多態例子:
#include <iostream>
using namespace std;
class GeoObj{
public:
virtual void draw() const = 0;
};
class Circle : public GeoObj{
public:
void draw() const{
cout << "circle is drawing!" << endl;
}
};
class Line : public GeoObj{
public:
void draw() const{
cout << "line is drawing!" << endl;
}
};
void myDraw(GeoObj const& obj){
obj.draw();
}
int main(){
Line l;
Circle c;
myDraw(l);
myDraw(c);
system("pause");
return 0;
}
二、靜多態
靜多態例子:
#include <iostream>
using namespace std;
class GeoObj{
public:
virtual void draw() const = 0;
};
class Circle : public GeoObj{
public:
void draw() const{
cout << "circle is drawing!" << endl;
}
};
class Line : public GeoObj{
public:
void draw() const{
cout << "line is drawing!" << endl;
}
};
template<typename T>
void myDraw(T const& obj){
obj.draw();
}
int main(){
Line l;
Circle c;
myDraw(l);
myDraw(c);
system("pause");
return 0;
}
三、動多態和靜多態比較
動多態和靜多態:
通過繼承實現的多態是綁定的和動態的;通過模板實現的多態是非綁定的和靜態的。
動多態優點:
a、能夠優雅地處理異類集合。
b、可執行代碼的大小通常比較小(因爲只需要一個多態函數,但對於靜多態而言,爲了處理不同的類型,必須生成多個不同的模板實例)。
c、可以對代碼進行完全編譯;因此並不需要發佈實現源碼(但是,分發模板庫通常都需要同時分發模板實現的源代碼)。
靜多態優點:
a、可以很容易地實現內建類型的集合。
b、所生成的代碼效率通常比較高(因爲並不存在通過指針的間接調用,而且,可以進行演繹的非虛擬函數具有更多的內聯機會)。
c、對於只提供部分接口的具體類型,如果在應用程序中只是使用到這一部分接口,那麼也可以使用該具體類型,而不必在乎該類型是否提供其他部分的接口。