类模板和函数模板的定义和使用类似。
类模板用于实现类所需求数据的类型参数化;
类模板在表示如数组、表、图等数据结构特别重要,这些数据结构的表示和算法不受所包含的元素类型影响;
单个类模板语法:
#include<iostream> using namespace std; //模板类 类型参数化 template <typename T> //此时类A为模板类 class A { public: A(T a = 0) { this->a = a; } public: void printA() { cout << "a: " << a << endl; } private: T a; }; int main() { //模板类本身是类型化的======具体的类=========>具体的变量 A<int>a1(11); //模板类是抽象的====》需要进行具体类型 a1.printA(); system("pause"); return 0; }
类模板做函数参数:
void UseA(A<int>&a) { a.printA(); }
模板类派生普通类
模板类的派生 必须具体化模板类.原理:c++编译器需要知道父类的数据类型具体是什么样子的。
要知道父类所占的内存大小是多少,只有数据类型固定下来,才知道如何分配内存。
class B : public A<int> //模板类的派生 必须具体化模板类.原理:c++编译器需要知道父类的数据类型具体是什么样子的 { //要知道父类所占的内存大小是多少,只有数据类型固定下来,才知道如何分配内存 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() { B b1(1,2); b1.printB(); system("pause"); return 0; }
模板类派生模板类
//从模板类派生模板类 template<typename T> class C : public A<T> { public: C(T c, T a) : A<T>(a) { this->c = c; } void printC() { cout << "c: " << c << endl; } protected: T c; };
void main() { C<int> c1(1, 2); c1.printC(); system("pause"); }