#include <mrw/smartpointer.hpp>

class A {
  public: int a;
  protected: virtual void fn() {} // dynamic_cast requires a virtual function
};

class B: virtual public A {
  public: int b;
};

int main(int, char**) {
  utl::SmartPointer<int> i1 = new int;
  *i1 = 13;
  utl::SmartPointer<int> i2 = i1;
  utl::SmartPointer<int> i3;
  if (!i3) i3 = i2;
  *i2 = 666;			// *i1 is now 666 too
  utl::SmartPointer<A> b1 = new B;
  utl::SmartPointer<B> b2 = b1; // b1 and b2 point to the same instance
  b1->a = 0;			// b1->b does not compile
  b2->a = 1;
  b2->b = 2;
  return 0;
} // memory is automatically freed
