public:is_a 模板类继承的几种简单常见的模式

对于最常见的public继承,有几种常见的模式,下面做一个简单的介绍。先贴出模板基类。

template<typename T>
class base
{
private:
	T value;
public:
	base(T t) :value(t){};
	base() :value(10){};
	~base(){};
	void show(){ cout << "value:" << value << endl; };
};

在具体介绍之前,先简单聊一下我理解的模板类和类模板,这就好比函数指针与指针函数,指针数组与数组指针的关系一样,二者显然是截然不同的。模板类顾名思义是一种确定的类型,例如base<int>,模板类的地位是等同于其他类的,其他类我们也可以起个名字,对比于模板类,我们称之为普通类。而类模板,是一个模板,上述的定义就是一个模板,一个关于类的模板(我的理解,如有不同观点还望指正)。

下面回到正题,第一种是普通类继承了一个模板类。

class s1 :public base<int>
{
private:
	string name;
public:
	s1(int t, const string& n1) :base(t), name(n1){};
	inline void show(){ cout << "name:" << name << endl; base::show(); };
	~s1(){};
};
实际上就等同于继承了一个普通的类,因为模板参数已经给出,派生类也不再需要template模板了,因此很类似于普通类继承普通类。public继承,在派生类里访问基类的public数据需要用base::运算符。

第二种是类模板继承模板类。

template<typename T>
class s2 :public base<int>
{
private:
	T value;
public:
	s2(int n1, T t) :base(n1), value(t){};
	s2(const base& b, T t) :base(b), value(t){};
	~s2(){};
	void show(){ cout << "value_inherit:" << value << endl; base::show(); };
};
这里和上面也是大同小异,无非继承者是个类模板。

第三种是类模板继承了一个模板。

template<typename T,typename G>
class s3 :public G
{
private:
	T value;
public:
	s3(T t) :G(), value(t){};
	~s3(){};
	void show(){ cout << "value_inherit:" << value << endl; G::show(); };
};

这个地方,因为编译的时候不了解基类的格式,因此在构造的时候只能使用默认的构造函数。

第四种是普通类继承了一个类模板。

template<typename T>
class s4 :public base<T>
{
private:
	T value;
public:
	s4(T t1, T t2) :base(t1), value(t2){};
	s4(const base<T>& bs, T vl) :base(bs), value(vl){};
	~s4(){};
	void show(){ cout << "value_inherit:" << value << endl; base<T>::show(); };
};





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值