根据上一篇博客中举的数组的例子,这篇博客就对其进行继承,再继承一个模板类出来。
下面程序中的searcharray模板就继承了之前的freearray模板类,然后在他的基础上实现对特定数组元素的查找操作:
//此模板继承自freearray
template <class T>
class SearchArray:public FreeArray<T>
{
public:
//构造函数
SearchArray(int s):FreeArray<T>(s){}
//拷贝构造函数
SearchArray(const SearchArray &);
//查找特定元素
int findItem(T);
};
template <class T>
SearchArray<T>::SearchArray(const SearchArray &obj)
{
for(int n=0;n<this->sizeArray();n++)
this->operator[](n) = obj[n];
}
template <class T>
int SearchArray<T>::findItem(T item)
{
for(int n=0;n<=this->sizeArray();n++)
{
if(this->operator[](n) == item)
return n;
}
return -1;
}
主函数测试:
//模板类的继承测试
SearchArray<int> arrInt(10);
int x;
for(x=0;x<10;x++)
arrInt[x] = x+3;
cout<<"the value of int array is:";
for(x=0;x<10;x++)
cout<<arrInt[x]<<" ";
cout<<"\n\nfind the item 6 in the int array:\n";
int result = arrInt.findItem(6);
if(result == -1)
cout<<"not find item 6!\n\n";
else
cout<<"the index of 6 is :"<<result<<endl;
return 0;
运行结果:
注意,从模板类A中继承得到模板类B的时候,这两个模板的定义最好都放在同一个头文件下。
根据测试,我使用的codeblocks和GCC的编译器不支持让他们放在两个文件中。
总结:
- 一个类模板不仅可以从另一个类模板中导出,也可以从一个普通类导出,当然普通类也可以继承一个模板类;
- 也就是说,普通类和模板类可以构成四种继承关系。