1. 程式人生 > >public:is_a 模板類繼承的幾種簡單常見的模式

public:is_a 模板類繼承的幾種簡單常見的模式

對於最常見的public繼承,有幾種常見的模式,下面做一個簡單的介紹。先貼出模板基類。

template<typename T>
class base
{
private:
	T value;
public:
	base(T t) :value(t){};
	base() :value(10){};
	~base(){};
	void show(){ cout << "value:" << value << endl; };
};

在具體介紹之前,先簡單聊一下我理解的模板類和類模板,這就好比函式指標與指標函式,指標陣列與陣列指標的關係一樣,二者顯然是截然不同的。模板類顧名思義是一種確定的型別,例如base<int>,模板類的地位是等同於其他類的,其他類我們也可以起個名字,對比於模板類,我們稱之為普通類。而類模板,是一個模板,上述的定義就是一個模板,一個關於類的模板(我的理解,如有不同觀點還望指正)。

下面回到正題,第一種是普通類繼承了一個模板類。

class s1 :public base<int>
{
private:
	string name;
public:
	s1(int t, const string& n1) :base(t), name(n1){};
	inline void show(){ cout << "name:" << name << endl; base::show(); };
	~s1(){};
};
實際上就等同於繼承了一個普通的類,因為模板引數已經給出,派生類也不再需要template模板了,因此很類似於普通類繼承普通類。public繼承,在派生類裡訪問基類的public資料需要用base::運算子。

第二種是類模板繼承模板類。

template<typename T>
class s2 :public base<int>
{
private:
	T value;
public:
	s2(int n1, T t) :base(n1), value(t){};
	s2(const base& b, T t) :base(b), value(t){};
	~s2(){};
	void show(){ cout << "value_inherit:" << value << endl; base::show(); };
};
這裡和上面也是大同小異,無非繼承者是個類模板。

第三種是類模板繼承了一個模板。

template<typename T,typename G>
class s3 :public G
{
private:
	T value;
public:
	s3(T t) :G(), value(t){};
	~s3(){};
	void show(){ cout << "value_inherit:" << value << endl; G::show(); };
};

這個地方,因為編譯的時候不瞭解基類的格式,因此在構造的時候只能使用預設的建構函式。

第四種是普通類繼承了一個類模板。

template<typename T>
class s4 :public base<T>
{
private:
	T value;
public:
	s4(T t1, T t2) :base(t1), value(t2){};
	s4(const base<T>& bs, T vl) :base(bs), value(vl){};
	~s4(){};
	void show(){ cout << "value_inherit:" << value << endl; base<T>::show(); };
};