Возможность смешивать составной шаблон и любопытно повторяющийся шаблон

У меня есть составная реализация шаблона, используемая для компонентов GUI:

class CObject {
private:

  CObject * m_pParent;  
  CObjectContainer * m_pChildren;

  void private_foo() {
    this->foo();
    //Calls private_foo for each child in container.
    m_pChildren->foo();
  }

public:
  virtual void foo() {
    //empty for base class
  }

  virtual CObject * duplicate() {
    //Do duplication code
    return new CObject(*this);
  }

  virtual CObject * detach() {
    //Remove this object (along with it's children)
    //from current tree.
    m_pParent->RemoveChild(this);
    m_pParent = nullptr;
    return this;
  }
}

class CSpecificObject : public CObject {
public:
  virtual void foo() {
    //Specific code for this class
  }

  virtual CSpecificObject * duplicate() {
    //Overload, but the code only calls diferent constructor
    return new CSpecificObject(*this);
  }

  virtual CSpecificObject * detach() {
    //Note the code is identical.
    m_pParent->RemoveChild(this);
    m_pParent = nullptr;
    return this;
  }
}

К сожалению, количество унаследованных классов быстро увеличивается, и дублирующий код (в данном примере только метод detach ()) доставляет мне головную боль.

Есть ли способ чисто реализовать методы detach (), сохраняя тип возвращаемого значения таким же, как и у объекта, для которого он вызывается?

Я думал о CRTP, но не могу придумать, как сохранить динамический полиморфизм вместе с полиморфизмом времени компиляции:

template 
class CObject {
private:
  ...
  Child * detach() {
    m_pParent->RemoveChild(this);
    m_pParent = nullptr;
    return static_cast(this);
  }
  ...
}

//Array of CObject* pointers is no longer possible.

Ответы на вопрос(3)

Ваш ответ на вопрос