類模板及派生
(一)
模板主要有兩大類:即函數模板和類模板。這裏主要講一下對類模板的理解。
模板書面上講就是一種對類型進行參數化的工具,那麼類模板就是對“類”這種類型進行參數化的工具(也可以理解爲一種類的輪廓,不限制類裏面參數的類型)。再打一個通俗的比方:假設類就是月餅,而類模板就是生產月餅的機器,當然月餅有很多種類,比如長的,方的,(等價於數據類型或者類中成員函數返回值類型就是整型、浮點型之類),我現在不知道機器能生產什麼形狀的月餅,只知道它能生產月餅。
類模板的定義
template <class T> class fun
{
};
template 是模板的關鍵字,後面括號裏面的class 是類名,T表示模板參數(形參),括號內表明T是一個類型,後面表示定義了一個名爲fun的類模型。
注意:類模板不是一個類,不能直接用於生成對象,所以fun f 是錯誤的。
要想用fun這個類生成對象,首先要指明它的類型,例如:fun<double>,fun<int>等等。也就是類模板的實例化,成爲模板類(太繞了,可以忽略模板類定義,只要知道類模板以及怎麼定義對象就好了)。
所以定義類模板的對象如下:
fun < int> a;
fun <float> b;
(二)
類模板的派生類可以是模板,也可以說非模板。這時,派生類模板的參數表中應包含基類模板的參數。
template <typename T>
class Base
{
};
template <typename T>
class D2: public Base<T> D2是派生類,也是一個模板,指出它的基類時,要綴上模板參數
{
};
在派生非類模板時,其基類一定是實例化之後的類,如下面的 base<int>
template <class T>
class base
{
……
};
class derive: public base<int> 這邊的類型T 已經實例化成了int 所以derive可以看成是派生的類,而不是模板
{
……
};