Re: [Boost-users] enable_shared_from_this & inheritance
-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users- bounces@lists.boost.org] On Behalf Of Peter Dimov Sent: Thursday, October 19, 2006 12:39 PM To: boost-users@lists.boost.org Subject: Re: [Boost-users] enable_shared_from_this & inheritance
Peter Dimov wrote:
I have no idea why this compiles. It shouldn't, B has two enable_shared_from_this<> bases, and the constructor will only initialize one of them. Only one of FooA and FooB works (FooA in this case). I'll investigate.
The code compiles on g++ and como, but neither FooA nor FooB works. Looks like an MSVC (and Borland) bug. It would be nice if I could find a way to make it fail at compile time instead of not working, though...
[Nat] <silly question> Could the ref count be put into a virtual base class so that only one instance would appear in a given leaf class, regardless of how many enable_shared_from_this<> bases it has?
Nat Goodspeed wrote:
[Nat] <silly question> Could the ref count be put into a virtual base class so that only one instance would appear in a given leaf class, regardless of how many enable_shared_from_this<> bases it has?
Not a silly question at all. Every enable_shared_from_this base contains a weak_ptr, not a reference count. The shared_ptr constructor looks up the enable_shared_from_this base and initializes its weak_ptr accordingly. This doesn't work when there are two or more enable_shared_from_this bases, though. I could put the weak_ptr in a virtual polymorphic base. This would force polymorphism on all clients of enable_shared_from_this... probably acceptable. It will also force a dynamic_pointer_cast in every shared_from_this, and this may be harder to swallow, particularly in cases where RTTI is off. So I'm not sure. If you do want the above behavior, it's easy to duplicate, as I already responded in my first post on the topic. Just make FooB return dynamic_pointer_cast<B>( FooA() ) and remove the enable_shared_from_this<B> base (A needs to be made polymorphic, of course).
participants (2)
-
Nat Goodspeed
-
Peter Dimov