[class.protected] (original) (raw)
An additional access check beyond those described earlier in [class.access]is applied when a non-static data member or non-static member function is a protected member of its naming class ([class.access.base]).98
As described earlier, access to a protected member is granted because the reference occurs in a friend or direct member of some class C.
All other accesses involve a (possibly implicit) object expression ([expr.ref]).
In this case, the class of the object expression shall beC or a class derived from C.
[Example 1: class B { protected: int i;static int j;};class D1 : public B { };class D2 : public B { friend void fr(B*,D1*,D2*);void mem(B*,D1*);};void fr(B* pb, D1* p1, D2* p2) { pb->i = 1; p1->i = 2; p2->i = 3; p2->B::i = 4; int B::* pmi_B = &B::i; int B::* pmi_B2 = &D2::i; B::j = 5; D2::j = 6; } void D2::mem(B* pb, D1* p1) { pb->i = 1; p1->i = 2; i = 3; B::i = 4; int B::* pmi_B = &B::i; int B::* pmi_B2 = &D2::i; j = 5; B::j = 6; } void g(B* pb, D1* p1, D2* p2) { pb->i = 1; p1->i = 2; p2->i = 3; } — _end example_]