Я пытаюсь реализовать класс Clonable с помощью CRTP. Однако мне нужен абстрактный класс с чистым виртуальным методом клонирования, переопределенным дочерними классами. Чтобы это произошло, мне нужно, чтобы функция клонирования возвращала ковариантный тип возвращаемого значения. Я сделал этот код ниже, и компилятор кричит мне об этой ошибке:
main.cpp:12:5: error: return type of virtual function 'clone' is not covariant with the return type of the function it overrides ('B *' is not derived from 'AbstractClonable *')
Класс «B» кажется дочерним классом AbstractClonable, и даже в двух направлениях! Как я могу это решить? Большое Вам спасибо. Я пробовал как с clang 3.6, так и с GCC 4.9.2
struct AbstractClonable {
virtual AbstractClonable* clone() const = 0;
};
template<typename T>
struct Clonable : virtual AbstractClonable {
T* clone() const override {
return new T{*dynamic_cast<const T*>(this)};
}
};
struct A : virtual AbstractClonable {
};
struct B : A, Clonable<B> {
};