Boost logo

Boost Users :

Subject: Re: [Boost-users] shared_ptr
From: Anthony Foiani (tkil_at_[hidden])
Date: 2010-04-23 17:48:58


Greetings --

Hammad <mh00219_at_[hidden]> writes:
> Please tell me how can base class pointer be assigned to derived
> class pointer? are they both same? if they then how?

I think that the short answer to your question is to include

  #include <boost/pointer_cast.hpp>

then, if your classes are polymorphic (i.e., they have 'virtual'
methods), use 'boost::dynamic_pointer_cast'; otherwise, use
'boost::static_pointer_cast'. The dynamic casts require a vtable, but
they have the advantage of checking that a given cast is correct (that
the base pointer really is to that derived class, or some class
further down that tree of the hierarchy). A static cast simply takes
your word for it.

A longer example:

  #include <iostream>

  #include <boost/pointer_cast.hpp>
  #include <boost/shared_ptr.hpp>

  class base
  {
  public:
      base() {}
  };

  class derived
         : public base
  {
  public:
      derived() : base() {}
      special() { std::cout << "special" << std::endl; }
  };

  int main( int argc, char * argv [] )
  {
      // this is fine, since a "base *" can hold a "derived *"
      boost::shared_ptr< base > bsp( new derived() );

      // error! the compiler only sees the static type, and 'base' has
      // no method named 'special'.
      bsp->special(); // error!

      // so we need to make a shared pointer with "derived" as the
      // pointed-at type:
      boost::shared_ptr< derived > dsp =
        boost::static_pointer_cast< derived >( bsp );

      // now the static type has the 'special' method:
      dsp->special();

      return 0;
  }


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