当类模板碰到继承时,需要注意一下几点:
- 当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型
- 如果不指定,编译器无法给子类分配内存
- 如果想灵活指定出父类中T的类型,子类也需变为类模板
举一个例子:
#include<string>
#include<iostream>
using namespace std;
template <class T>
class Bass
{
T m;
};
//class Son :public Bass//报错:缺少类模板”boss“的参数列表
//1、必须要知道父类中的T的数据类型,才能继承给子类
class Son:public Bass<int>
{
};
//2、如果想灵活的指定父类中T的类型,子类也需要变类模板
template<class T1, class T2>
class Son2 :public Bass<T2>
{
T1 obj;
public:
Son2()
{
cout << typeid(T1).name() << endl;
cout << typeid(T2).name() << endl;
}
};
void test02()
{
Son2<int, char>S2;
/*此时的话,TI的数据类型是给定的int, 但是T2的话,给了父类中的T。因为Son2继承自父类的T2
也就是说,现在的话,Bass中的T的数据类型是char*/
}
int main()
{
test02();
system("pause");
return 0;
}
这里主要强调的是第二点。可以看一下运行的结果是:
int
char
请按任意键继续. . .
总结
如果父类是类模板,子类需要指定出父类中T的数据类型