類别範本繼承和部分具體化例子及非型別引數
模板類必須所有的方法定義放到一個檔案中。因為模板類不是函式不能單獨編譯
template<typename T1,typename T2,int T3>
class myext:public mybase<T2>
模板定義兩個型別引數T1,T2,定義個非型別引數T3,他在使用期間如同一個常數。這個T3可以用來處理動態陣列,並且繼承了模板類mybase並且將型別引數T2賦予給他
template<typename T2,int T3>
class myext<int,T2,T3>:public mybase<T2>
模板定義一個型別引數T2,定義一個非型別引數T3,那麼這裡的T2就代表他是泛型的,而不具體化,但是開始的T1變為了具體化的int,並且繼承了模板類mybase並且將型別引數T2賦予給他
template<typename T1,typename T2,int T3>
void myext<T1,T2,T3>::set(const T1 &in)
這是第一個模板類定義方法的方法
template<typename T2,int T3>
void myext<int,T2,T3>::set(const int &in)
這是第二個模板類定義方法的方法
呼叫:
myext<string,string,4> test2("test","gaopeng"); 將匹配template<typename T1,typename T2,int T3> class myext:public mybase<T2>
myext<int,int,10> test1(1,1); 將匹配template<typename T2,int T3> class myext<int,T2,T3>:public mybase<T2>
具體化過後當然選擇的方法是選擇匹配程度最高的模板。
下面是具體的測試程式碼沒有實際意義:
輸出:
use specialization template
test1
test1
test1
test1
test1
test1
test1
test1
test1
test1
110
110
110
110
110
110
110
110
110
110
1
use general template
test
test
test
test
gaopeng
template<typename T1,typename T2,int T3>
class myext:public mybase<T2>
模板定義兩個型別引數T1,T2,定義個非型別引數T3,他在使用期間如同一個常數。這個T3可以用來處理動態陣列,並且繼承了模板類mybase並且將型別引數T2賦予給他
template<typename T2,int T3>
class myext<int,T2,T3>:public mybase<T2>
模板定義一個型別引數T2,定義一個非型別引數T3,那麼這裡的T2就代表他是泛型的,而不具體化,但是開始的T1變為了具體化的int,並且繼承了模板類mybase並且將型別引數T2賦予給他
template<typename T1,typename T2,int T3>
void myext<T1,T2,T3>::set(const T1 &in)
這是第一個模板類定義方法的方法
template<typename T2,int T3>
void myext<int,T2,T3>::set(const int &in)
這是第二個模板類定義方法的方法
呼叫:
myext<string,string,4> test2("test","gaopeng"); 將匹配template<typename T1,typename T2,int T3> class myext:public mybase<T2>
myext<int,int,10> test1(1,1); 將匹配template<typename T2,int T3> class myext<int,T2,T3>:public mybase<T2>
具體化過後當然選擇的方法是選擇匹配程度最高的模板。
下面是具體的測試程式碼沒有實際意義:
點選(此處)摺疊或開啟
-
標頭檔案
-
tmp.h
-
#include<iostream>
-
using namespace std;
-
-
template<typename T1>
-
class mybase
-
{
-
private:
-
T1 a;
-
public:
-
mybase(T1 in)
-
{
-
a=in;
-
}
-
virtual void show(void) const
-
{
-
cout<<a<<endl;
-
}
-
virtual ~mybase(){}
-
};
-
-
template<typename T1,typename T2,int T3>
-
class myext:public mybase<T2>
-
{
-
private:
-
T1 b;
-
public:
-
myext(T1 in1,T2 in2):mybase<T2>(in2)
-
{
-
b=in1;
-
}
-
virtual void show(void) const
-
{
-
for(int i=0;i<T3;i++)
-
cout<<b<<endl;
-
mybase<T2>::show();
-
}
-
virtual ~myext(){}
-
-
virtual void set(const T1&);
-
};
-
-
template<typename T1,typename T2,int T3>
-
void myext<T1,T2,T3>::set(const T1 &in)
-
{
-
b=in;
-
for(int m=0;m<T3;m++)
-
{
-
cout<<"test"<<endl;
-
}
-
}
-
-
template<typename T2,int T3>
-
class myext<int,T2,T3>:public mybase<T2>
-
{
-
private:
-
int b;
-
public:
-
myext(int in1,T2 in2):mybase<T2>(in2)
-
{
-
b=in1+100;
-
}
-
virtual void show(void) const
-
{
-
for(int i=0;i<T3;i++)
-
cout<<b<<endl;
-
mybase<T2>::show();
-
}
-
virtual ~myext(){}
-
virtual void set(const int&);
-
};
-
template<typename T2,int T3>
-
void myext<int,T2,T3>::set(const int &in)
-
{
-
b=in+100;
-
for(int m=0;m<T3;m++)
-
{
-
cout<<"test1"<<endl;
-
}
- }
點選(此處)摺疊或開啟
-
main函式
-
-
#include<iostream>
-
#include"tmp.h"
-
using namespace std;
-
-
-
int main(void)
-
{
-
cout<<"use specialization template"<<endl;
-
myext<int,int,10> test1(1,1);
-
test1.set(10);
-
test1.show();
-
cout<<"use general template"<<endl;
-
myext<string,string,4> test2("test","gaopeng");
-
test2.show();
- }
use specialization template
test1
test1
test1
test1
test1
test1
test1
test1
test1
test1
110
110
110
110
110
110
110
110
110
110
1
use general template
test
test
test
test
gaopeng
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2124228/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 非型別的類别範本引數型別
- 陣列類别範本陣列
- 類别範本 單例模板單例
- c++函式模板和類别範本C++函式
- 類别範本的常見用法
- pua 八股類别範本
- C++ 類别範本的寫法C++
- 從本質認識JavaScript的原型繼承和類繼承JavaScript原型繼承
- 【演算法學習】數學專題 有理數類别範本演算法
- c++中模板_類别範本的宣告和定義C++
- 征服 JavaScript 面試:類繼承和原型繼承的區別JavaScript面試繼承原型
- 封裝不同類别範本的隨機數生成器封裝隨機
- 【C++】 59_類别範本深度剖析C++
- C++ 單例類别範本(詳解)C++單例
- C++之函式模板與類别範本的區別(三)C++函式
- C++知識點57——類别範本(2、類别範本的區域性特化與預設模板實參)C++
- 繼承+多型+抽象類繼承多型抽象
- 隱藏在 SDK 中的單例類别範本單例
- 【C++】 61_智慧指標類别範本C++指標
- 自定義 Xcode ViewController 類别範本XCodeViewController
- c++佇列類别範本的實現C++佇列
- JS原型繼承和類式繼承JS原型繼承
- 類别範本及其成員函式的定義及注意事項函式
- 【C++ 泛型程式設計01:模板】函式模板與類别範本C++泛型程式設計函式
- 繼承中引數傳遞及呼叫順序繼承
- Java抽象類、繼承及多型和介面卡的實現Java抽象繼承多型
- 繼承和多型繼承多型
- 多型和繼承多型繼承
- c++類别範本成員函式報錯C++函式
- TypeScript(5)類、繼承、多型TypeScript繼承多型
- scala_繼承、型別判斷、抽象類、匿名內部類繼承型別抽象
- 淺析 Python 的類、繼承和多型Python繼承多型
- 三種繼承的方法:public 繼承/private繼承/protected繼承詳解及區別繼承
- 介面是否可繼承(extends)介面? 抽象類是否可實現 (implements)介面? 抽象類是否可繼承具體類(concrete class)?繼承抽象
- 類的繼承_子類繼承父類繼承
- c++11-17 模板核心知識(二)—— 類别範本C++
- es5繼承和es6類和繼承繼承
- css可繼承屬性和非繼承屬性一覽CSS繼承