A protected nonstatic base class member can be accessed by members and friends
of any classes derived from that base class by using one of the
following:
If a class is derived privately from a base class, all protected base class members become private members of the derived class.
If you reference a protected nonstatic member x of a base class A in a friend or a member function of a derived class B, you must access x through a pointer to, reference to, or object of a class derived from A. However, if you are accessing x to create a pointer to member, you must qualify x with a nested name specifier that names the derived class B. The following example demonstrates this:
class A { public: protected: int i; }; class B : public A { friend void f(A*, B*); void g(A*); }; void f(A* pa, B* pb) { // pa->i = 1; pb->i = 2; // int A::* point_i = &A::i; int A::* point_i2 = &B::i; } void B::g(A* pa) { // pa->i = 1; i = 2; // int A::* point_i = &A::i; int A::* point_i2 = &B::i; } void h(A* pa, B* pb) { // pa->i = 1; // pb->i = 2; } int main() { }
Class A contains one protected data member, an integer i. Because B derives from A, the members of B have access to the protected member of A. Function f() is a friend of class B:
Function g() is a member function of class B. The previous list of remarks about which statements the compiler would and would not allow apply for g() except for the following:
Function h() cannot access any of the protected members of A because h() is neither a friend or a member of a derived class of A.
Related References