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 laClone
a 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