具有多态模板参数的多态模板类

时间:2013-01-12 10:29:07

标签: c++ templates inheritance polymorphism idioms

在简化设计中,B类以多态方式继承A类。 模板化类Base<T>具有T*成员,用于进一步操作。 Derived<T>Base<T>多态继承。 什么是允许这种对象创建的语法:

Base<A>* a = new Derived<B>();

为了进一步参考,我使用的代码看起来像这样(当然,转换不成功):

class A
{
public:
  A()
  {
    cout<< " A  ";
  }
  virtual void one()
  {
    cout<<" 1 ";
  }

};

class B: public A
{
public:
  B()
  {
    cout << " B  ";
  }
  void one()

  {
      cout << " 2 ";
  }
};

template <class T>
class Base
{

public:
    T* thing;
  Base()
  {
    cout<<"Base";
    thing = new T;
  }
  template <class S>
  Base(Base<S>* obj)
  {
    thing = obj->thing;
  }
  virtual void poly(){ thing->one();}
};
template <class T>
class Derived : public Base<T>
{
public:
  Derived()
  {
    cout << "DERIVED ";
  }
  virtual void poly(){ 
};
int main(int argc, char** argv)
{
  //Base<A>* a = (new Derived<B>());
  return 0;
}

为了简洁代码,故意省略虚拟析构函数和适当的内存管理。

编辑:此构造的唯一目的是将BaseTemplated<BasePolymorphic>*指针列在一起,而不是BaseTemplated<Derived1>用于BaseTemplated<DerivedN>对于基类的所有N个子类,多态类。

3 个答案:

答案 0 :(得分:4)

首先,告诉我什么时候进入“简单化”部分。

将所有一半模板剥离,只关注你想要变形的部分。最终,您有不同的类Base<A>Base<B>。 (后者通过推导Derived<B>)。

这些都不会从各自的模板参数继承。因此,AB的关系(等级或其他)是无关紧要的。 Base<A>Base<B>是截然不同且不相关的,因此您尝试执行的操作无法正常工作。事实上,即使 分别从AB继承,你最希望的是一个A*指针,你不是' t在你的样本中使用。

如果另有说明,我很乐意删除它,因为我真的很好奇。

答案 1 :(得分:3)

一袋苹果Base<B>不是一袋水果Base<A>,因为你可以把桃子,樱桃和梨放在一袋水果里。

答案 2 :(得分:1)

这不适用于指针。 new Derived<B>的结果无法分配给Base<A>*,实际上它甚至无法分配给Derived<A>*,因为所有这些类型都不相关。你真的需要模板封装器之间的这种关系吗?是否足以保证Base<B>Base<A>的值的可兑换性(正如标准的智能指针那样)?您已经使用模板化转换构造函数...

//...
Base<B> tB(new B);
Base<A> tA = tB;
//...