【c++】面向对象程序设计之访问控制与继承
受保护的成员(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; } };
当一个类将另一个类声明为友元时,这种友元关系只对做出声明的类有效,对于原来那个类来说,其友元的基类或者派生类不具有特殊的访问能力。
默认的继承保护级别
默认派生运算符由定义派生类所用的关键字来决定,默认情况下,使用class关键字定义的派生类是私有继承的,而使用struct关键字定义的派生类是共有继承的。
class base{};
struct d1:base{};//默认public继承
class d2:base{};//默认privat继承
使用struct关键字和class关键字定义类的唯一的差别是默认成员访问说明符和默认派生访问说明符
总结:
1.派生类的友元只能通过派生类对象来访问基类的成员
2.派生访问说明符不影响派生类成员或友元对基类成员的访问,只影响派生类对象对基类成员的访问
3.基类的友元只能访问基类成员,不能访问派生类成员,但可以访问派生类对象中的基类部分