C++类的访问权限
首先明确一个类的用户有三种:
- 一类用户:类的成员和友元
- 二类用户:子类的成员及子类的友元
- 三类用户:外部的用户代码(通过类的对象或指针)
一个类有三种成员
- private:只有一类用户可以访问
private
成员。 - protected:只有一、二类用户可以访问
protected
成员。 - public:所有用户都可访问
派生访问说明符
作用是确定父类成员在子类中的访问权限的上限,在public继承的情况下,所有父类成员在子类中的访问权限不变,在protected继承情况下,父类的public成员变protected,在private继承下,父类的public和protected成员变private。默认情况下是private继承,也就是父类成员在子类中默认private。通过using
可以改变父类成员在子类中的访问权限:using用法总结
class A
{
public:
int a;
protected:
int b;
};
class B : private A {};
class C : B
{
void f() {cout << b;} //错误,B是private继承A,A::a,A::b是B的private成员。 C作为B的二类用户,只能访问B的protected和public成员。
}
int main()
{
B b;
cout << b.b;//错误,外部访问(三类用户)只能访问B的public成员,A::b是B的private的成员。
}
派生访问说明符还影响用户操作子类向父类的转换。其实很好理解,子类(对象或指针)对父类public成员访问是有限制的(protected或private继承),如果转换成父类对象就可以访问父类的public成员,所以编译器需要拒绝这种转换。当然,如果子类是public继承,也就是说子类的对象或指针可以访问父类的public成员,那么转换成父类对象或指针也就不存在非法访问的问题了,这时候是允许转换的。
class A{};
class B : protected A {
void f()
{
A *p = this;//正确
}
};
int main()
{
B b;
A *p = &b;//错误,类B是protected继承A的
}