Possibilidade de misturar padrão composto e padrão de modelo curiosamente recorrente

Eu tenho uma implementação de padrão composto, usada para componentes da 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;
  }
}

Infelizmente, o número de classes herdadas aumenta rapidamente e o código duplicado (no exemplo dado apenas o método detach ()) está me dando dor de cabeça.

Existe uma maneira de implementar de forma limpa métodos detach (), mantendo o tipo de retorno igual ao objeto, no qual é chamado?

Eu estava pensando em CRTP, mas não consigo pensar em uma maneira de manter o polimorfismo dinâmico junto com o polimorfismo no tempo de compilação:

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

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

questionAnswers(3)

yourAnswerToTheQuestion