1、类内访问说明符
出现在类内部的访问说明符,作用如下代码及注释所示:
值得注意的是: 派生类的成员或者友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类对象中的受保护成员没有访问特权。下述代码举例进行了说明。
// 类内访问说明符,访问限制由弱到强排序:public > protected > private
class Base {
// class默认为private,struct默认public
int pri_mem1;
public:
int pub_mem; // public成员,对类的用户等均可以访问
protected:
int prot_mem; // protected成员,类的用户不可访问,对派生类的成员和友元可访问
private:
int pri_mem; // private成员,只有类本身可以访问
};
void test(Base &b)
{
// 正确:可以访问Base的public成员
b.pub_mem = 0;
// 错误:无法访问Base的protected成员
b.prot_mem = 0;
// 错误:无法访问Base的private成员
b.pri_mem = 0;
}
// Priv_Derv类继承Base类
class Priv_Derv : Base {
public:
// 注:派生类的成员或友元只能通过派生类对象访问基类的受保护成员。
// 派生类对于一个基类对象中的受保护成员没有访问特权
void test(Base &b)
{
// 正确:可以访问Base的public成员
b.pub_mem = 0;
// 错误:派生类对于一个基类对象中的受保护成员没有访问特权
b.prot_mem = 0;
// 错误:无法访问Base的private成员
b.pri_mem = 0;
}
void test(Priv_Derv &derv)
{
// 正确:可以访问Priv_Derv的public成员
derv.pub_mem = 0;
// 正确:派生类只能通过派生类对象访问基类的受保护成员。
derv.prot_mem = 0;
// 错误:无法访问Priv_Derv的private成员
derv.pri_mem = 0;
}
};
2、派生访问说明符
该访问说明符出现在派生类的派生列表中,如下代码所示:
值得注意的是:
-
派生类访问说明符对于派生类的成员(及友元)能否访问其直接基类的成员没有影响。对基类成员的访问权限只与基类中的访问说明符有关。
-
派生访问说明符的目的是控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限,下述代码举例进行了说明。
class Base {
public:
int pub_mem; // public成员,对类的用户等均可以访问
protected:
int prot_mem; // protected成员,类的用户不可访问,对派生类的成员和友元可访问
private:
int pri_mem; // private成员,只有类本身可以访问
};
// 派生访问说明符,class默认为私有继承,struct默认为公有继承
// 注:1、派生类访问说明符对于派生类的成员能否访问其直接基类的成员没有影响
// 公有继承Base
class Pub_Derv : public Base {
// 正确:派生类能访问protected成员
int f() { return prot_mem; }
// 错误:private成员对于派生类来说是不可访问的
int g() { return pri_mem; }
};
// 私有继承Base
class Priv_Derv : private Base {
// 正确:private不影响派生类对直接基类的访问权限
int f1() const {return prot_mem;}
};
// 受保护的继承Base
class Prot_Derv : protected Base {
// 正确:protected不影响派生类对直接基类的访问权限
int f2() const {return prot_mem;}
};
// 2、派生访问说明符的目的是控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限
void test()
{
Pub_Derv d1; // 继承自Base的成员是public的
Priv_Derv d2; // 继承自Base的成员是private的
d1.pub_mem = 0; // 正确:pub_mem在派生类中是public的
d2.pub_mem = 0; // 错误:pub_mem在派生类中是private的
}
// struct和class的差异仅在于默认的访问说明符不同
struct Derived_from_Public : public Pub_Derv {
// 正确:Base::prot_mem在Pub_Derv中仍然是protected的
int use_base() { return prot_mem; }
};
struct Derived_from_Private : public Priv_Derv {
// 错误:Base::prot_mem在Priv_Derv中是private的
int use_base() { return prot_mem; }
};