Я не совсем уверен, как назвать эту схему наследования, но я пытаюсь использовать интерфейс cloneable
с реализацией по умолчанию. У меня проблемы с получением правильной схемы.
Я основываю это на клонируемом интерфейсе, определенном в C #.
Сначала у меня есть интерфейс и реализации по умолчанию:
template<class BaseType>
class ICloneable
{
public:
virtual std::shared_ptr<BaseType> Clone() const = 0;
};
template<class BaseType, class DerivedType>
class Cloneable : public ICloneable<BaseType>
{
public:
virtual std::shared_ptr<BaseType> Clone() const
{
return std::shared_ptr<BaseType>(new DerivedType(*(DerivedType*)this));
}
};
Мое желание - иметь следующую схему.
// A pure virtual base interface
class Base : public ICloneable<Base>
{
public:
virtual void SomeFunc() = 0;
}
// Another implementation
class Imp1 : public Base, Cloneable<Base, Imp1>
{
public:
virtual void SomeFunc() {}
}
// An implementation
class Imp2 : public Cloneable<Base, Imp2>
{
public:
virtual void SomeFunc() {}
}
Если у меня есть список объектов `std :: shared_ptr ', я могу вызывать функцию Clone, когда я хочу сделать глубокую копию, без необходимости вручную писать функцию в каждой из реализаций.
Прямо сейчас я понимаю, что Imp - это абстрактный класс, который меня не удивляет. Кто-нибудь знает, как заставить эту идею реализации по умолчанию работать? Смысл в том, что не нужно вручную писать функцию клона для каждой из реализаций. Возможно, это не выполнимо, но у меня нет идей, чтобы попробовать.