Możliwość łączenia złożonego wzoru i ciekawie powtarzającego się wzoru szablonu

Mam implementację złożonego wzoru, używaną dla komponentów 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;
  }
}

Niestety liczba dziedziczonych klas gwałtownie wzrasta, a duplikat kodu (w podanym przykładzie tylko metoda detach () daje mi ból głowy).

Czy istnieje sposób na czyste zaimplementowanie metod detach (), zachowując typ powrotu taki sam jak obiekt, na którym jest wywoływany?

Myślałem o CRTP, ale nie mogę wymyślić sposobu na utrzymanie dynamicznego polimorfizmu wraz z polimorfizmem czasu kompilacji:

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