“BaseChild<BaseParent>*”和“DerivedChild<DerivedParent>*”之间的不匹

Mismatched type error between `BaseChild<BaseParent>*` and `DerivedChild<DerivedParent>*`

本文关键字:之间 DerivedChild BaseChild BaseParent DerivedParent      更新时间:2023-10-16

我很难为这个问题想出一个好名字,我为此道歉。 如果阅读后您有更好的名字,请告诉我。 无论如何,我有一些类似于以下内容的代码:

// BaseFamily.h
template<typename T>
class BaseChild {
  T parent;
}
class BaseParent {
  virtual BaseChild<BaseParent>* createChild() = 0;
}

.

// DerivedFamily.h
class DerivedParent;
class DerivedChild: public BaseChild<DerivedParent> {}
class DerivedParent
  : public BaseParent
{
  BaseChild<BaseParent>* createChild() override {
    return new DerivedChild();  
    // error: Cannot initialize return object of type 'BaseChild<BaseParent> *' with an rvalue of type 'DerivedChild *'
  }
}

上面是两组父>

这似乎至少应该接近于作为指向 BaseChild 的指针应该能够处理指向 DerivedChild 的指针,但这些似乎不能与我所知道的任何语法互换。

把它放在一个问题中:我怎样才能使返回类型BaseChild<BaseParent>*的函数允许DerivedChild<DerivedParent>*

编辑:我可能已经找到了一个线索派生模板类。 但CRTP似乎并不能解决这个问题。

class BaseParent; // forward declaration
class BaseChild{
public:
  BaseChild(BaseParent* parent_)
    :parent(parent_)
  {}
  BaseParent* parent;
}
class BaseParent {
  virtual BaseChild* createChild() = 0;
}
class DerivedParent;
class DerivedChild: public BaseChild {
public:
  DerivedChild(DerivedParent* parent)
    :BaseChild(parent)
  {}
}
class DerivedParent
  : public BaseParent
{
  BaseChild* createChild() override {
    return new DerivedChild();  
  }
}

我不知道这个问题的上下文,所以我不确定这是否有帮助。