Modelos e covariâncias curiosamente recorrentes derivados
Suponha que eu tenha uma classe base que seja a clonagem de classes derivadas:
class Base
{
public:
virtual Base * clone()
{
return new Base();
}
// ...
};
Eu tenho um conjunto de classes derivadas que são implementadas usando um padrão de modelo curiosamente recorrente:
template <class T>
class CRTP : public Base
{
public:
virtual T * clone()
{
return new T();
}
// ...
};
E eu tento derivar disso ainda mais assim:
class Derived : public CRTP<Derived>
{
public:
// ...
};
Eu recebo erros de compilação para o efeito de:
error C2555: 'CRTP<T>::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'
Eu percebo que isso é provavelmente o resultado de o compilador não conhecer completamente a árvore de herança do Derived ao instanciar o CRTP. Além disso, a substituição do tipo de retorno (T *) com (Base *) também compila. No entanto, gostaria de saber se existe um trabalho em torno do qual retenha a semântica acima.