初探类模板
上一篇文章简单介绍了c++的模板机制以及函数模板:浅谈c++的模板机制(一) – 函数模板
这篇文章主要介绍c++的类模板。先来看一个具体实例:
template <typename T>
class A
{
private:
T a;
public:
A(T a = 0)
{
this->a = a;
}
void printA()
{
cout << "A: " << a << endl;
}
};
上面这个类A就是一个模板类。a的类型是 T, 而不是一个具体的类型,a的类型随着类A对象的建立而改变。模板类是抽象的,并没有在内存中分配存储空间。如果想创建类A的对象,如下:
A<int> a1(11); // 模板类是抽象的 ==》需要进行类型具体化
a1.printA();
这样便创建了一个int型的A对象。
类模板做函数参数
前面已经提到过,类模板是一个抽象的概念,因此不能直接做函数形参;如果需要将一个类模板传给一个函数,那么需要将其具体化,如下:
void useA(A<int> &a)
{
a.printA();
}
一个类模板的完整程序:
# include <iostream>
using namespace std;
template <typename T>
class A
{
private:
T a;
public:
A(T a = 0)
{
this->a = a;
}
void printA()
{
cout << "A: " << a << endl;
}
};
// 类模板做函数参数
void useA(A<int> &a)
{
a.printA();
}
int main(void)
{
A<int> a1(11);
a1.printA();
useA(a1);
return 0;
}
在win 10 vs2017下运行结果:
A: 11
A: 11
请按任意键继续. . .
类模板的继承
从一个类模板派生出一个普通类
从一个类模板派生出一个普通类时,c++编译器需要知道父类是什么类型的,只有这样才能为它分配内存。因为派生出的是一个普通类,普通类就意味着内存大小是确定的。另外注意派生类构造函数的写法。
template <typename T>
class A
{
protected:
T a;
public:
A(T a = 0)
{
this->a = a;
}
void printA()
{
cout << "A: " << a << endl;
}
};
class B : public A<int>
{
public:
B(int a = 10, int b = 20) : A<int>(a)
{
this->b = b;
}
void printB()
{
cout << "a: " << a << "b: " << b << endl;
}
private:
int b;
};
完整程序:
# include <iostream>
using namespace std;
template <typename T>
class A
{
protected:
T a;
public:
A(T a = 0)
{
this->a = a;
}
void printA()
{
cout << "A: " << a << endl;
}
};
class B : public A<int>
{
public:
B(int a = 10, int b = 20) : A<int>(a)
{
this->b = b;
}
void printB()
{
cout << "a: " << a << "b: " << b << endl;
}
private:
int b;
};
int main(void)
{
B b1(1, 2);
b1.printB();
b1.printA();
return 0;
}
在win 10 vs2017下运行结果:
a: 1b: 2
A: 1
请按任意键继续. . .
从一个类模板派生出一个类模板
这种情况下派生类还是一个模板类。如下:
template <typename T>
class C : public A<T>
{
private:
T c;
public:
C(T c, T a) : A<T>(a)
{
this->c = c;
}
void printC()
{
cout << "C : " << c << endl;
}
};
完整程序:
template <typename T>
class A
{
protected:
T a;
public:
A(T a = 0)
{
this->a = a;
}
void printA()
{
cout << "A: " << a << endl;
}
};
template <typename T>
class C : public A<T>
{
private:
T c;
public:
C(T c, T a) : A<T>(a)
{
this->c = c;
}
void printC()
{
cout << "C : " << c << endl;
}
};
int main(void)
{
C<int> c(1, 2);
c.printC();
return 0;
}
在win 10 vs2017下运行结果:
C : 1
请按任意键继续. . .