C++类的访问权限

首先明确一个类的用户有三种:

  1. 一类用户:类的成员和友元
  2. 二类用户:子类的成员及子类的友元
  3. 三类用户:外部的用户代码(通过类的对象或指针)

一个类有三种成员

  1. private:只有一类用户可以访问private成员。
  2. protected:只有一、二类用户可以访问protected成员。
  3. 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的
}
posted @ 2022-05-24 11:40  hellozhangjz  阅读(512)  评论(0编辑  收藏  举报