Even if B
is indeed derived from Clonable<B>
, the problem here is that Clonable<B>
construction is not valid, as it defines
B* clone() const override
which of course is not an override of AbstractClonable::clone()
, since the compiler doesn’t see B
at this point as a child of AbstractClonable
. So I believe the issue lays in the fact that the compiler cannot build the Clonable<B>
base of B
.
A workaround (but not really the same as what you want) is to define
Clonable* clone() const override
in Clonable
. As you mentioned in the comment, you can also define a free function
template<typename T>
T* clone(const T* object)
{
return static_cast<T*>(object->clone());
}
Related: Derived curiously recurring templates and covariance