2

在一个简单化的设计中,B 类多态地继承了 A 类。一个模板类,Base<T>有一个T*用于进一步操作的成员。ADerived<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 个子类。

4

3 回答 3

4

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

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

这些都不是从它们各自的模板参数继承的。A因此to的关系(分层或其他)B是无关紧要的。Base<A>并且Base<B>是不同的且不相关的,因此您尝试按原样执行的操作是行不通的。事实上,即使确实A分别从 a和继承B,您所希望的最好的结果是一个A*指针,您没有在您的示例中使用它。

如果不是这样,我很乐意删除它,因为我真的很好奇。

于 2013-01-12T10:44:23.593 回答
3

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

于 2013-01-12T10:49:30.940 回答
1

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

//...
Base<B> tB(new B);
Base<A> tA = tB;
//...
于 2013-01-12T11:07:33.597 回答