// The base class template<class Crtp, class MsgT> class Receiver { void receive(MsgT) { static_cast<Crtp*>(this)->private_ += 1; } }; // The derived class template<class MsgT> struct Dispatcher : public Receiver<Dispatcher<MsgT>, MsgT> { //_private member exposed to the base class, called Receiver using Receiver<Dispatcher, MsgT>::Receiver; friend Receiver<Dispatcher, MsgT>; private: int private_; };