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.

questionAnswers(2)

yourAnswerToTheQuestion