In C++ we can do this:
struct Base
{
virtual Base* Clone() const { ... }
virtual ~Base(){}
};
struct Derived : Base
{
virtual Derived* Clone() const {...} //overrides Base::Clone
};
However, the following won't do the same trick:
struct Base
{
virtual shared_ptr<Base> Clone() const { ... }
virtual ~Base(){}
};
struct Derived : Base
{
virtual shared_ptr<Derived> Clone() const {...} //hides Base::Clone
};
In this example Derived::Clone
hides Base::Clone
rather than overrides it, because the standard says that the return type of an overriding member may change only from reference(or pointer) to base to reference (or pointer) to derived. Is there any clever workaround for this? Of course one could argue that the Clone
function should return a plain pointer anyway, but let's forget it for now - this is just an illustratory example. I am looking for a way to enable changing the return type of a virtual function from a smart pointer to Base
to a smart pointer to Derived
.
Thanks in advance!
Update: My second example indeed doesn't compile, thanks to Iammilind
Clone()
might also be called in a non-polymorphic context, where it is desirable not to lose the type information. – Mayworm