KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
As Scott Myers wrote, you can take advantage of a relaxation in C++'s type-system to declare clone() to return a pointer to the actual type being declared: class Base { virtual Base* clone() const = 0; }; class Derived : public Base { virtual Derived* clone() const }; The compiler detects that clone() returns an pointer to the type of the object, and allows Derived to override it to return a pointer to derived. It would desirable to have clone() return a smart pointer that implies transfer of ownership semantics, like the following: class Base { virtual std::auto_ptr<Base> clone() const = 0; }; class Derived : public Base { virtual std::auto_ptr<Derived> clone() const; }; Unfortunately, the relaxation of the conventions does not apply to templated smart pointers, and the compiler will not allow the override. So, it seems I am left with two options: Have clone() return a "dumb" pointer, and document that clients are responsible for disposing of it. Have clone() return a smart base pointer, and have clients use dynamic_cast to save them to a Derived pointer if they need it. Is one of these approaches preferred? Or is there a way for me to eat my transfer of ownership semantics and have my strong type safety too?
Tags (comma-separated)
Save Edits
Cancel