Получены любопытно повторяющиеся шаблоны и ковариации

Предположим, у меня есть базовый класс, который клонирует производные классы:

class Base
{
    public:
        virtual Base * clone()
        {
            return new Base();
        }

        // ...
};

У меня есть набор производных классов, которые реализованы с использованием любопытно повторяющегося шаблона:

template 
class CRTP : public Base
{
    public:
        virtual T * clone()
        {
            return new T();
        }

        // ...
};

И я пытаюсь извлечь из этого следующее:

class Derived : public CRTP
{
    public:
        // ...
};

Я получаю ошибки компиляции с эффектом:

error C2555: 'CRTP::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'

Я понимаю, что это, вероятно, результат того, что компилятор не полностью знает дерево наследования для Derived при создании экземпляра CRTP. Кроме того, замена типа возврата (T *) на (Base *) также компилируется. Тем не менее, я хотел бы знать, есть ли работа, которая сохраняет вышеуказанную семантику.

Ответы на вопрос(2)

Ваш ответ на вопрос