C++ Cloneable mixin

У меня есть несколько классов, которым нужно определить следующую функцию clone:

struct Base
{
  virtual Base * clone() const = 0;
};

struct A : public Base
{
    Base * clone() const {
      return new A(*this);
  }
};

struct B : public Base
{
    Base * clone() const {
      return new B(*this);
  }
};

struct X : public Base2
{
    Base2 * clone() const {
      return new X(*this);
  }
};

Я пытаюсь сделать это с помощью миксина Cloneable для избегайте этого избыточного кода:

template <typename BASE, typename TYPE>
class CloneableMixin
{
public:
  BASE*clone() const {
    return new TYPE( dynamic_cast<const TYPE &>(*this) );
  }
};

struct A : public Base, public CloneableMixin<Base, A>
{
};

Однако это не работает, потому что в new TYPE(*this)from CloneableMixin, *thisимеет тип CloneableMixin.

Обновление:CloneableMixinможет dynamic_castпривести к правильному типу. Но теперь у меня другая проблема: CloneableMixin::cloneне может успешно переопределить Base::clone, поэтому компилятор сообщает, что A является абстрактным типом.

Может ли разумное использование виртуальногонаследования позволить CloneableMixin::cloneпереопределить Base::clone? Есть ли какой-то макрос, который я должен использовать для этого?

Знаете ли вы, как обойти весь этот избыточный код?

6
задан user 4 May 2012 в 06:31
поделиться