【c++ templates讀書筆記】【6】模板的多態

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、對於只提供部分接口的具體類型,如果在應用程序中只是使用到這一部分接口,那麼也可以使用該具體類型,而不必在乎該類型是否提供其他部分的接口。



發佈了155 篇原創文章 · 獲贊 22 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章