一、每个类分别控制着其成员对于派生类来说是否可访问:
1、受保护成员
- 受保护成员对于类的用户来说是不可访问的;
- 受保护成员对于派生类的成员和友元来说是可访问的;
- 派生类的成员和友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类对象中的受保护成员没有任何访问权限。
示例代码:
class Base
{
protected:
int prot_mem;
};
class Sneaky: public Base
{
friend void clobber(Sneaky&);
friend void clobber(Base&);
int j;
};
//正确:clobber能访问Sneaky对象的private和protected成员
void clobber(Sneaky &s) { s.j=s.prot_mem = 0; }
//错误:clobber不能访问Base对象的protected成员
void clobber(Base &b) { b.prot_mem = 0; }
即可以这样描述:派生类的友元和成员实际上能访问的是派生类对象中相关的基类部分的受保护成员,而不能访问一个基类对象的受保护成员及私有成员。这样规定的目的是为了防止基类中protected提供的访问保护被规避掉。
二、公有、私有和受保护继承:
1、影响某个类对继承而来的成员的访问权限的两个影响因素:
- 基类中该成员的访问说明符——控制派生类对其直接基类部分成员的访问权限。
- 派生类的派生列表中的访问说明符——对于派生类的成员(及友元)能否访问其直接基类的成员没什么影响。此说明符的目的是控制派生类用户(普通用户和该派生类的派生类)对于基类成员的访问权限。
三、类的用户:
1、不考虑继承的情况
- 普通用户(其所编写的代码使用类的对象)——只能访问类的公有(接口)成员
- 类的实现者(负责编写类的成员和友元的代码)——既能访问类的公有部分,也能访问类的私有(实现)部分
2、考虑继承的情况
- 包含不考虑继承的情况提到的两种用户
- 派生类——可访问基类的公有(接口)成员、受保护成员(派生类及其友元不能访问基类的私有成员)