
Updated, after looking into other's implementation: template<class Derived> class intrusive_pointee_base { private: typedef intrusive_pointee_base self; protected: intrusive_pointee_base(void) : reference_counter_(0) {} intrusive_pointee_base(self const&) : reference_counter_(0) {} intrusive_pointee_base operator=(self const&) { return *this } ~intrusive_pointee_base(void) {} private: friend void intrusive_ptr_add_ref(const Derived * p) { ::InterlockedIncrement(&static_cast<self const *>(p)->reference_counter_); } friend void intrusive_ptr_release(const Derived * p) { if (!::InterlockedDecrement(&static_cast<self const *>(p)->reference_counter_)) delete p; } mutable volatile long reference_counter_; };