考慮如下**:
templateclass cbase
;class cdriver : public cbase
上面的**出現了2個問題:
1. 模板類的t,在整個模板類中並沒有用到
2. 派生類以特化的模板類作基類,但是卻用自身特化
實際上,這兩個問題是為了實現同乙個功能:
cbase是個模板類,但其有個static成員函式指標。那麼:
class cdrivera : public cbase
class cdriverb : public cbase
如果是這樣的**,cdrivera與cdriverb會從同乙個特化模板派生,則cdrivera與cdriverb會共享這個static成員函式指標。若不希望共享,可以採用這樣的方式:
class cdrivera : public cbase
class cdriverb : public cbase
這樣,cdrivera與cdriverb會從不同特化模板派生,從而cdrivera與cdriverb不共享這個static成員函式指標。
而實際上,由於t型別並沒有在模板中使用,因此編譯時這個t是什麼並不重要。
於是:class cdrivera : public cbase
class cdriverb : public cbase
這樣的**是合法的,並且其特化模板不同,從而cdrivera與cdriverb不共享這個static成員函式指標。
這就是用template實現多型的方法。
實際上,在模板類中,只要不涉及t的「實際實現」,即便**中有t也是可以的。
不涉及實際實現的情況有以下幾個:
1. t作函式返回值,包括t&與t*
2. t作函式成員變數,一定要是t*
示例**:定義乙個單件父類,從而派生類都是單件:
templateclasssingleton
; singleton(constsingleton&){};
singleton&operator=(constsingleton&){};
~singleton();
public:
statict&getinstance();
statict*getinstanceptr();
private:
statict* _instance;
};templatet*singleton::_instance=nullptr;
templatesingleton::~singleton()
}templatet&singleton::getinstance()
return*_instance;
}templatet*singleton::getinstanceptr()
return_instance;
}
在派生類中:
#include"singleton.h"
class myclass : public singleton
private:
myclass() {};
//myclass(constmyclass&) {};
//myclass& operator =(constmyclass&) {};
~myclass() {};
friend singleton;
//friend class auto_ptr;
}
上述**就是乙個奇異迴圈模板及其派生類。
注意:1. 模板類的建構函式,拷貝建構函式,=運算子和析構函式不可以為private,因為private函式不能被派生類訪問。考慮到是單件,定義為public並不合適,故定義為protected最合適。
2. 派生類中,由於是迴圈模板,所以相當於是令基類訪問自身,所以要新增:
friend singleton;
這樣,基類就可以訪問自身。
3. 派生類無法再派生。
4. 實際上,派生類的建構函式,拷貝建構函式,=運算子和析構函式都可以不再定義。
注意上面的**僅適用於單執行緒。若要在多執行緒下使用,需要在getinstance
()函式中引入加鎖和雙檢測機制。
類模板的特化,偏特化
class templates 的特化 specializations 你可以針對某些特殊的模板引數,對乙個類模板進行特化。類模板的特化與函式模板的過載類似,使你得以針對某些特定型別進行 優化,或修正某個特定型別在函式模板具現化中的錯誤行為。然而如果你對乙個類模板進行特化,就必須特化其所有成元函式。...
類模板的偏特化
class templates 可以被偏特化 partial specialized,或稱部份特化 區域性特化 這使你得以在特定情形下使用特殊實作碼,但仍然留給你 使用者 選擇 template parameters 的能力。例如對於下 面的 class template template clas...
模板的特化
首先要再提一下什麼是模板,模板有什麼作用?模板是泛型程式設計的基礎。所謂泛型程式設計是編寫與型別無關的邏輯 是一種復用的方式,模板分為模板函式和模板類。編譯呼叫模板函式或模板類時,編譯器會根據傳遞的引數自動推演出模板形參的型別,並自動生成對應的 這是前面我們已經提到過的,下面我們來了解一下模板的特化...