У меня есть несколько классов, которым нужно определить следующую функцию 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
? Есть ли какой-то макрос, который я должен использовать для этого?
Знаете ли вы, как обойти весь этот избыточный код?