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