类模板与派生

概述

模板也可以继承。分为以下几种:

  • 类模板从类模板派生
  • 类模板从模板类派生
  • 类模板从普通类派生
  • 普通类从模板类派生

1、类模板从类模板派生

//类模板A
template <class T1,class T2>
class A {
	T1 v1; T2 v2;
};
//由类模板A派生的类模板B
template <class T1,class T2>
class B:public A<T2,T1> {//模板类A派生出模板类B。则,模板类A的参数也由模板类B的参数确定。
	T1 v3; T2 v4;
};
//由类模板B派生的类模板C
template <class T>
class C:public B<T,T>{
	T v5;
};

int main()
{
	B<int,double> obj1;
	C<int> obj2;
	return 0;
}

//生成的模板类:
class B<int,double>:
public A<double,int>
{
	int v3; double v4;
};

class A<double, int>
{
	double v1; int v2;
}

2、类模板从模板类派生

template <class T1,class T2>
class A {
	T1 v1; T2 v2;
};
template <class T>
class B:public A<int,double> {
	T v;
};
int main() {
	B<char> obj1; //自动生成两个模板类: A<int,double> 和 B<char>
	return 0;
}

区分清楚,类模板由类模板派生,类模板由模板类派生:

  • 类模板由模板类派生的话,在使用子类模板时,父类类模板的参数时确定了的,也就是产生了一个模板类,只是子类的参数还不确定。因此派生出来的仍是个模板。
  • 类模板由类由类模板派生,在使用模板之前,子类模板和父类模板的参数都还没确定,但是子类模板和父类模板参数最终都由子类模板的参数列表确定。

3、 类模板从普通类派生

//普通类
class A {
	int v1;
};
//由普通类派生的模板诶
template <class T>
class B:public A {//所有从B实例化得到的类, 都以A为基类
	T v;
};

int main() {
	B<char> obj1;
	return 0;
}

4、普通类从模板类派生

template <class T>
class A {
	T v1;
	int n;
};

class B:public A<int> {
	double v;
};

int main() {
	B obj1;
	return 0;
}
posted @ 2019-12-12 20:04  江南又一春  阅读(418)  评论(0编辑  收藏  举报