template <class Derived> class Base
{
friend class Derived;
void Bind(X & x);
};

class Derived: Base<Derived>
{
X x;
public:
Derived(void) { Bind(&x); }
};

これで親も子も完全に守られてるのでprotectedの出番はない