Covariância do tipo de retorno com ponteiros inteligentes

Em C ++, podemos fazer isso:

struct Base
{
   virtual Base* Clone() const { ... }
   virtual ~Base(){}
};

struct Derived : Base
{
   virtual Derived* Clone() const {...} //overrides Base::Clone
};

No entanto, o seguinte não fará o mesmo truque:

struct Base
{
   virtual shared_ptr<Base> Clone() const { ... }
   virtual ~Base(){}
};

struct Derived : Base
{
   virtual shared_ptr<Derived> Clone() const {...} //hides Base::Clone
};

Neste exemploDerived::Clone esconde Base::Clone ao invés de substitui, porque o padrão diz que o tipo de retorno de um membro substituinte pode mudar apenas de referência (ou ponteiro) para base para referência (ou ponteiro) para derivado. Existe alguma solução inteligente para isso? Claro que alguém poderia argumentar que oClone função @ deve retornar um ponteiro simples de qualquer maneira, mas vamos esquecer por enquanto - este é apenas um exemplo ilustrativo. Estou procurando uma maneira de ativar a alteração do tipo de retorno de uma função virtual de um ponteiro inteligente paraBase para um ponteiro inteligente paraDerived.

Desde já, obrigado

Atualizar Meu segundo exemplo, de fato, não compila, graças a Iammilind

questionAnswers(4)

yourAnswerToTheQuestion