您的位置:首页 > 其它

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

2018-01-26 21:54 253 查看
对于最常见的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(); };
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 类的继承 模板类