首先明确一个类的用户有三种:
- 一类用户:类的成员和友元,访问权限最高
- 二类用户:派生类的成员及派生类的友元
- 三类用户:外部的用户代码
一个类有三种成员
- private:只有一类用户可以访问
private
成员。 - protected:只有一、二类用户可以访问
protected
成员。 - public:所有用户都可访问
针对二类用户访问protected成员有一点说明:对于一个派生类对象,只能通过派生类去访问基类的protected成员,而不能通过基类去访问。
class A
{
protected:
int a;
};
class B : A
{
void f()
{
A *p = this;
int c = p->a;//错误,p是基类指针,不能通过基类访问受保护成员
int d = this->a;//正确
}
};
派生访问说明符
仅影响派生类的二三类用户对基类成员的访问。默认情况下,类B的二类用户(C的一类用户)可以访问A的public
和protected
成员,类B的三类用户可以访问A的public
成员。但添加派生访问说明符会可能缩小B的二三类用户访问基类成员的权限。
class A
{
public:
int a;
protected:
int b;
};
class B : private A {};
class C : B
{
void f() {cout << b;} //错误,B是private继承A,若是protected或者public继承,则正确。
}
int main()
{
B b;
cout << b.a;//错误,只有B是public继承A才正确。
}
派生访问说明符还影响用户操作派生类向基类的转换,但不影响派生类成员和友元进行类型转换。tip:如果某个节点可以通过派生类对基类的公有成员进行访问,那就可以进行派生类到基类的类型转换。
class A{};
class B : protected A {
void f()
{
A *p = this;//正确
}
};
int main()
{
B b;
A *p = &b;//错误,类B是protected继承A的
}