访问说明符
访问说明符 | 本类内 | 友元 | 子类内 | 类外 |
---|
private | √ | √ | × | × | protected | √ | √ | √ | × | public | √ | √ | √ | √ |
(默认成员的访问权限是private的) 样例:
class A {
int a; //默认为private
public:
int b;
protected:
int c;
private:
int d;
public:
void func() {
//类内都可访问
a = 0;
b = 0;
c = 0;
d = 0;
}
friend void AFriend(A &a);
};
class B : public A {
public:
void func() {
//子类只有父类部分的public和protected可以访问
//a = 0;
b = 0;
c = 0;
//d = 0;
}
void testA(A& a) {
this->c; //可以访问
//不可访问:派生类只能访问自身基类部分的protcted成员,
//对于其它的基类对象的protected成员不可访问
//cout << a.c;
}
void AFriend(A& a) {
cout << a.a << endl;
}
int main() {
A a;
//a.a = 0; //私有的,不可访问
a.b = 0;
//a.c = 0; //受保护的,不可访问
//a.d = 0; //私有的,不可访问
AFriend(a);
return 0;
}
注意:派生类只能访问自身基类部分的protcted成员,对于其它的基类对象的protected成员是不可访问的。就好像父亲愿意给你的物品你可以拿,但是别人的父亲给自己儿子的物品你不能拿。
公有、私有和保护继承
某个类对其继承而来的成员的访问权限受到两个因素影响:一个是在在基类中该成员的访问说明符,另一个是继承时在派生列表中的访问说明符。
class AA : public A{}
class BA : public A{}
class CA : public A{}
需要注意的是,派生访问说明符对于派生类的成员(及友元)对基类成员的访问并不会有影响, 派生类能否访问基类成员只与基类成员的访问说明符有关。 派生访问说明符的目的是控制派生类的使用者(包括派生类的派生类)能否访问派生类的基类部分成员: 派生访问说明符对派生类内对基类成员访问不影响:
class A {
public:
void pub_func(){}
protected:
void pro_func(){}
private:
void pri_func(){}
};
class PubA : public A {};
class ProA : protected A {};
class PriA : private A {
void test() {
//派生类内能否访问只与基类成员访问说明符有关
pub_func();
pro_func();
//pri_func(); //私有的不可访问
}
};
对派生类用户有影响:
int main() {
PubA pubA;
ProA proA;
PriA priA;
pubA.pub_func();
//proA.pub_func(); //不可访问
//priA.pub_func(); //不可访问
return 0;
}
包括派生类的派生类:
class APubA : public PubA {
void test() {
//PubA公有继承自A,其子孙类对A的访问权限不变
pub_func();
pro_func();
//pri_func();
}
};
class BPubA : public ProA {
void test() {
//PubA保护继承自A,A的公开成员对BPubA为保护的
pub_func(); //protected的
pro_func();
//pri_func();
}
};
class CPubA : public PriA {
void test() {
//PubA私有继承自A,A的所有成员对CPubA为私有的
//pub_func();
//pro_func();
//pri_func();
}
};
改变个别成员的可访问性
如果需要修改派生类继承的基类的个别成员的访问级别,可以通过using声明来实现:
class A{
public:
int pub_v;
protected:
int pro_v;
}
class B : private A{ //私有继承
public:
using A::pub_v; //修改该成员访问级别
protected:
using A::pro_v;
}
默认的继承保护级别
struct的默认继承级别是public的,而class的默认继承级别是private的。
struct B : A{} //相当于struct B : public A{}
class B : A{} //相当于class B : private A{}
补充:在C++中,其实struct和class唯一的差别就是默认成员访问说明符和默认派生访问说明符不同,除此之外使用上没有其他差别。
相关资料: 《C++Primer》第五版 7.2、15.5节
|