Non direttamente, ma è possibile simularlo rendendo le funzioni virtuali effettive inaccessibili dall'esterno della classe e avvolgendo la chiamata di funzione virtuale in una funzione non virtuale. Il rovescio della medaglia è che dovrete ricordare di implementare questa funzione wrapper su ogni classe derivata. Ma potresti aggirare questo mettendo sia la dichiarazione della funzione virtul che il wrapper nella macro.
using namespace boost; // for shared_ptr, make_shared and static_pointer_cast.
// "Fake" implementation of the clone() function.
#define CLONE(MyType) \
shared_ptr<MyType> clone() \
{ \
shared_ptr<Base> res = clone_impl(); \
assert(dynamic_cast<MyType*>(res.get()) != 0); \
return static_pointer_cast<MyType>(res); \
}
class Base
{
protected:
// The actual implementation of the clone() function.
virtual shared_ptr<Base> clone_impl() { return make_shared<Base>(*this); }
public:
// non-virtual shared_ptr<Base> clone();
CLONE(Base)
};
class Derived : public Base
{
protected:
virtual shared_ptr<Base> clone_impl() { return make_shared<Derived>(*this); }
public:
// non-virtual shared_ptr<Derived> clone();
CLONE(Derived)
};
int main()
{
shared_ptr<Derived> p = make_shared<Derived>();
shared_ptr<Derived> clone = p->clone();
return 0;
}
possibile duplicato di http://stackoverflow.com/questions/196733/how-can-i-use-covariant-return-types-with-smart-pointers –