类模板及派生
(一)
模板主要有两大类:即函数模板和类模板。这里主要讲一下对类模板的理解。
模板书面上讲就是一种对类型进行参数化的工具,那么类模板就是对“类”这种类型进行参数化的工具(也可以理解为一种类的轮廓,不限制类里面参数的类型)。再打一个通俗的比方:假设类就是月饼,而类模板就是生产月饼的机器,当然月饼有很多种类,比如长的,方的,(等价于数据类型或者类中成员函数返回值类型就是整型、浮点型之类),我现在不知道机器能生产什么形状的月饼,只知道它能生产月饼。
类模板的定义
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可以看成是派生的类,而不是模板
{
……
};