从继承的C ++类

时间:2018-04-01 14:59:39

标签: c++ templates inheritance

所以我试图填充从模板类继承的类的自定义集合,如此

template<typename T>
class Parent {
public: 
  T value;
  Parent(T val) {value = val;}
}

class ChildA : Parent<int> {
... 
}

class ChildB : Parent<double> {
...
}

// ==== Collections ====
template<typename cT>
class ParentCollection {
public:
  cT list[10];
}

class ACollection : ParentCollection<ChildA> {
...
}

class BCollection : ParentCollection<ChildB> {
...
}

所以我想在ParentCollection中添加一个函数,它允许我生成列表数组并添加一个新的cT类型。这应该由孩子们继承。如果我要在ACollection或BCollection中写这个,那就像是:

void ACollection::Add(int val) {...}

void BCollection::Add(double val) {...}

分别。但是,由于这两者都做了完全相同的事情,除了生成不同的Childrens之外,我想在ParentCollection中写这个,但我无法弄清楚如何做以下事情:

void ParentCollection::Add(T val) {...}

也就是说,在ParentCollection的parms中使用Parent类模板中的T类型。这样的事情可能吗?或者我必须为两个子集合分别编写添加函数。

2 个答案:

答案 0 :(得分:3)

通常,公开模板参数是一个好主意,因为由于C ++没有反射功能,否则在类本身之外获取它们会很麻烦:

// inside parent class
using value_type = T;

然后,您可以引用此typedef来指定您的成员函数签名:

void Add(typename cT::value_type val)

答案 1 :(得分:1)

您可以在父类中键入def T类型,然后在派生类中使用它:

current_company

解决此问题的具体说明:

  • 在Parent类中,添加:typedef T ParentT
  • 然后您可以使用ChildA :: ParentT(int)或ChildB :: ParentT(double)类型
  • 在ParentCollection类中,您可以通过执行以下操作再次公开:typedef typename cT :: ParentT ParentT
  • 在ACollection中,您可以将其作为ParentT访问。
  • 在ParentCollection中,您可以将函数声明编写为:void Add(ParentT val);
  • 但是,函数定义需要限定ParentT类型,因为您在类范围之外,因此您编写:void ParentCollection :: Add(ParentCollection :: ParentT val){...}