#include class A { public: int a; public: virtual ~A() {} protected: virtual void fn() {} // dynamic_cast requires a virtual function }; class B: virtual public A { public: int b; }; int main(int, char**) { mrw::SmartPointer i1 = new int; *i1 = 13; mrw::SmartPointer i2 = i1; mrw::SmartPointer i3; if (!i3) i3 = i2; *i2 = 666; // *i1 is now 666 too mrw::SmartPointer b1 = new B; mrw::SmartPointer 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