为什么需要类模板
类模板与函数模板的定义和使用类似,有时,有两个或者多个类,其功能是相同的,仅仅是数据类型不同,如下面声明的一个类:
类模板用于实现类所需数据的类型参数化
类模板在表示如数组、表、图等数据结构显得特别重要, 这些数据结构的表示和算法不受所包含的元素类型的影响
单个类模板的语法
#include "iostream"
using namespace std;
template <typename T>
class A //模板类
{
public:
A(T a = 0)
{
this->a = a;
}
void printA()
{
cout << "a: " << a << endl;
}
private:
T a;
};
//类模板做函数参数的用法
//C++编译器要求参数必须是具体的类,所以要A<int> &a
void UseA(A<int> &a)
{
a.printA();
}
//模板类(本身就是类型化的) ==> 具体的类 ==> 定义具体的变量
//模板了中如果使用了构造函数,则遵守以前的类的构造函数的调用规则
void main()
{
A<int> a1(11), a2(22); //模板类是抽象的 需要进行类型具体化
a1.printA();
//模板类做函数参数的用法
UseA(a1);
UseA(a2);
system("pause");
return;
}
继承中的类模板语法
1、从模板类派生了普通类:
#include "iostream"
using namespace std;
template <typename T>
class A //模板类
{
public:
A(T a = 0)
{
this->a = a;
}
void printA()
{
cout << "a: " << a << endl;
}
protected:
T a;
};
/* 1、从模板类派生了普通类 */
//子模板类派生时,C++编译器需要明确的知道父类的数据类型具体的类型,因此class B : public A<int>
//==>要知道父类所占的内存大小是多少,只有数据类型固定下来,才能具体分配内存
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;
};
void main()
{
B b1(1, 2);
b1.printB();
system("pause");
}
2、从模板类 派生模板类:
#include "iostream"
using namespace std;
template <typename T>
class A //模板类
{
public:
A(T a = 0)
{
this->a = a;
}
void printA()
{
cout << "a: " << a << endl;
}
protected:
T a;
};
/* 1、从模板类派生了普通类 */
//子模板类派生时,C++编译器需要明确的知道父类的数据类型具体的类型,因此class B : public A<int>
//==>要知道父类所占的内存大小是多少,只有数据类型固定下来,才能具体分配内存
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;
};
//2、从模板类 派生模板类
template <typename T>
class C : public A<T>
{
public:
C(T a = 10, T c = 20) : A<T>(a) //子类中构造函数一定要初始化父类,因此使用参数列表
{
this->c = c;
}
void printC()
{
cout << "a: " << a << "c: " << c << endl;
}
private:
T c;
};
void main()
{
C<int> c1(1, 2);
c1.printC();
system("pause");
}