Listing 7

#include <memory>
#include <iostream>
using std::tr1::shared_ptr; using std::tr1::static_pointer_cast;
using std::tr1::dynamic_pointer_cast; using std::tr1::const_pointer_cast;

struct base1
  { // simple base class
  virtual ~base1() {}
  };

struct base2
  { // another simple base
  virtual ~base2() {}
  };

struct derived : base1, base2
  { // derived class
  };

int main()
  { // demonstrate cast functions
  shared_ptr<const base1> sp0(new derived);
  shared_ptr<const derived> sp1 = static_pointer_cast<const derived>(sp0);
  shared_ptr<const base2> sp2 = dynamic_pointer_cast<const base2>(sp0);
  shared_ptr<base1> sp3 = const_pointer_cast<base1>(sp0);
  return 0;
  }