受保护的成员(protected):
1.和私有成员类似,受保护的成员对于类的用户来说是不可访问的
2.和共有成员类似,受保护的成员对于派生类的成员和友元来说是可访问的
3.派生类的友元只能通过派生类对象来访问基类的受保护成员,不能通过基类对象来访问基类的受保护成员
class base { protected: int pro; }; class sneaky :public base { friend void clobber(sneaky&); friend void clobber(base&); int j; }; //正确 void clobber(sneaky &s) { s.j = s.pro = 0; } //错误 void clobber(base &b)//基类对象 { b.pro = 0; }
派生访问说明符:
派生访问说明符对于派生类的成员(及友元)能否访问其直接基类的成员没影响,对基类成员的访问权限只与基类中的访问说明符有关。
派生访问说明符的目的是控制派生类用户即派生类对象对于基类成员的访问权限。若派生访问说明符是private(private继承),则基类中所有成员对于派生类对象来说是私有的。
友元与继承
就像友元关系不能传递一样,友元关系也不能继承。基类的友元在访问派生类成员时不具有特殊性,类似地,派生类的友元也不能随意访问基类的成员
class base { protected: int pro; friend class pal; }; class sneaky :public base { friend void clobber(sneaky&); friend void clobber(base&); int j; }; class pal { public: int f(base b)//正确,pal是base的友元 { return b.pro; } int f2(sneaky s)//错误 { return s.j; } int f3(sneaky s)//正确,pal是base的友元,所以pal能够访问base对象的成员, {//这种可访问性包括了base对象内嵌在其派生类中的情况 return s.pro; } };