Covarianza de tipo de retorno con punteros inteligentes

En C ++ podemos hacer esto:

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

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

Sin embargo, lo siguiente no hará el mismo truco:

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

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

En este ejemploDerived::Clone se escond Base::Clone más bien que reemplaza it, porque el estándar dice que el tipo de retorno de un miembro superior puede cambiar solo de referencia (o puntero) a base a referencia (o puntero) a derivado. ¿Hay alguna solución inteligente para esto? Por supuesto, uno podría argumentar que laClonea función @ debería devolver un puntero simple de todos modos, pero olvidémoslo por ahora, este es solo un ejemplo ilustrativo. Estoy buscando una manera de permitir cambiar el tipo de retorno de una función virtual de un puntero inteligente aBase a un puntero inteligente aDerived.

¡Gracias por adelantado

Actualizar Mi segundo ejemplo de hecho no se compila, gracias a Iammilind