15.5 访问控制与继承
protected:它希望与派生类分享但是不想被其他公共访问使用的成员
一些性质:
和私有成员类似,受保护的成员对于类的用户来说是不可访问的
和公有成员类似,受保护的成员对于派生类的成员和友元来说是可访问的
派生类的成员或友元只能通过派生类对象来访问基类的受保护成员
派生类对于一个基类对象中的受保护成员没有任何访问特权
class Base
{
protected:
int prot_mem;
};
class Sneaky :public Base
{
friend void clobber(Sneaky&);
friend void clobber(Base&);
int j;
};
void clobber(Sneaky& s)
{
s.j = s.prot_mem = 0; //继承的派生类对象可以访问protected
}
void clobber(Base& b)
{
b.prot_mem = 0; //报错,因为它只是Sneaky的友元,但不是Base的友元。
}
公有,私有和受保护继承
某个类对其继承而来的成员的访问权限受到两个因素影响:
1:基类中该成员的访问说明符
2.派生类的派生列表中的说明符
class Base
{
protected:
int prot_mem;
public:
void pub_mem();
private:
char priv_mem;
};
struct Pub_Derv :public Base
{
int f()
{
return prot_mem; //protected是受派生类可访问的
}
char g()
{
//return priv_mem; 报错,对于派生类来说,private成员是不可访问的
}
};
struct Priv_Derv :private Base
{
int f1()const
{
return prot_mem; //继承的private并不影响派生类的访问权限
}
char c2()const
{
// return priv_mem;//私有的成员还是不能被派生类访问
//就是说你派生类的访问说明符对派生类的成员能否访问其直接基类的成员没什么影响,
//对基类中的访问说明符对基类的访问权限才是有关的
}
};
//class Sneaky :public Base
//{
// friend void clobber(Sneaky&);
// friend void clobber(Base&);
// int j;
//};
//
//void clobber(Sneaky& s)
//{
// s.j = s.prot_mem = 0;