I am reading through the paper by B. Strousstrup on multiple inheritance and this is what is says. A class can have an arbitrary number of virtual base classes. One can cast from a derived class to a virtual base class, but not from a virtual base class to a derived class. The former involves following the virtual base pointer; the latter cannot be done given the information available at run time. Storing a ''back-pointer'' to the enclosing object(s) is non-trivial in general and was considered unsuitable for C++ as was the alternative strategy of dynamically keeping track of the objects ''for which'' a given member function invocation operates. The uses of such a back-pointer mechanism did not seem to warrant the added implementation complexity, the extra space required in objects, and the added run-time cost of initialization. class Cloneable : public virtual CloneableBase { .. } As per B. Strousstrup we cannot do it. Am I missing something obvious? I have also seen the following error - something expected .. cannot convert from base `CloneableBase' to derived type `A' via virtual base `CloneableBase I will read through the entire chain again. Appreciate your time. -----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Daniel Krügler Sent: Wednesday, June 25, 2008 9:45 AM To: boost-users@lists.boost.org Subject: Re: [Boost-users] shared_ptr invalid covariant return type Khandelwal, Amit wrote:
I read the discussion and tried it using gcc version 3.2.3 I am getting the following error.
clone2.cpp:34: sorry, not implemented: adjusting pointers for covariant returns clone2.cpp:34: sorry, not implemented: adjusting pointers for covariant returns clone2.cpp:34: sorry, not implemented: adjusting pointers for covariant returns clone2.cpp: In member function `std::auto_ptr<Derived> Cloneable<Derived>::clone() const [with Derived = A]': clone2.cpp:50: instantiated from here
clone2.cpp:17: invalid static_cast from type `CloneableBase*' to type `A*
I think my code is right. Any thoughts?
#include <memory>
class CloneableBase { public: virtual ~CloneableBase() {};
protected: virtual CloneableBase* doClone() const = 0 ; };
template < typename Derived > class Cloneable : public virtual CloneableBase { public: typedef std::auto_ptr<Derived> AutoPtr; AutoPtr clone() const { return AutoPtr( static_cast
( doClone() ) ); } }; template < typename Derived > class NaturallyCloneable : public virtual CloneableBase { protected:
virtual CloneableBase* doClone() const { return new Derived( static_cast< const Derived& >(*this) ); } };
class A : public Cloneable<A> {}; // abstract base for B and C class B : public A, public NaturallyCloneable<B> {}; class C : public A { virtual A* doClone() const { return new C; } };
int main() { { B b; C c; b.clone(); c.clone(); } }
This problem was discussed in the thread and lead to the final implementation that uses dynamic_cast instead of static_cast inside of Cloneable. The final solution also provides a nice SmartPointer policy, which solves the problem of the return type (Note that the pointer policy does even support naked pointers as well). Greetings from Bremen, Daniel _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This message is intended only for the personal and confidential use of the designated recipient(s) named above. If you are not the intended recipient of this message you are hereby notified that any review, dissemination, distribution or copying of this message is strictly prohibited. This communication is for information purposes only and should not be regarded as an offer to sell or as a solicitation of an offer to buy any financial product, an official confirmation of any transaction, or as an official statement of Lehman Brothers. Email transmission cannot be guaranteed to be secure or error-free. Therefore, we do not represent that this information is complete or accurate and it should not be relied upon as such. All information is subject to change without notice. -------- IRS Circular 230 Disclosure: Please be advised that any discussion of U.S. tax matters contained within this communication (including any attachments) is not intended or written to be used and cannot be used for the purpose of (i) avoiding U.S. tax related penalties or (ii) promoting, marketing or recommending to another party any transaction or matter addressed herein.