Boost logo

Boost Users :

From: Khandelwal, Amit (amit.khandelwal_at_[hidden])
Date: 2008-06-25 10:52:29


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_at_[hidden] [mailto:boost-users-bounces_at_[hidden]] On Behalf Of Daniel Krügler
Sent: Wednesday, June 25, 2008 9:45 AM
To: boost-users_at_[hidden]
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<Derived *>( 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_at_[hidden]
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.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net