类的继承和访问控制

  • 2016/8/18 16:49

    重要 关键概念:类的用户(primer 5th page 545

    一个类,我们可以认为有三类用户:

    1. 普通用户,也就是类的对象,这些对象只能给访问public成员
    2. 类的实现者,也就是基类的函数(及友元),他们能够访问类的所有部分
    3. 类的派生类,派生类和普通用户类似,也是类的用户,但是它还能够访问类的protected成员

     

    类的访问说明符 publicprivateprotected

    类的访问说明符,是类的用户的访问控制,也就是:

    1. 普通用户只能给访问public成员
    2. 类的派生类能够访问publicprotected成员
    3. 类本身和友元能够访问所有成员

     

    派生访问说明符 publicprivateprotected

    派生访问说明符不会控制派生类对直接基类的访问权限,只是影响派生类的用户的访问权限

    比如下面,A2函数f1中,始终不能访问a,始终能够访问bc,不管13行中是以怎么的方式继承A1.

    但是,对于A2的用户来说(A2 的对象,A2 的派生类),13行的派生访问说明符就会产生效果。

    具体效果是,

    1. 如果是private继承,那么A1中所有成员在A2中相当于用类的访问说明符private修饰一样,对于A2的用户都不可访问。
    2. 如果是public继承,那么A1中的成员在A2中保在A1中的..
    3. 如果是protected继承,

    见下面。

     

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    class A1
    {
      protected:
        int a;

    private:
        int b;

    public:
        int c;
    };

    class A2 : public A1
    {
        
    int b;
        
    void f1()
        {
            a;
     // 错误
            b;
            c;
        }
    };

     

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    //多重继承
    class B1
    {
      public:
        int a;
    };

    class B2 : private B1
    {
      public:
        int b;
        void f1()
        {
            a;
        }
    };

    class B3 : private B2
    {
        
    int c;
        
    void f1()
        {
            a;
     // 不能被访问了
            b;
            c;
        }
    };

     

     

    怎么改变派生访问说明符的控制:使用using

    primer 5th page 545

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    //多重继承
    class B1
    {
      public:
        int a;
    };

    class B2 : private B1
    {
      public:
        int b;
        void f1()
        {
            a;
        }
        using B1::a;
    };

    class B3 : private B2
    {
        int c;
        void f1()
        {
            a;
            b;
            c;
        }
    };

     

     

    来自网上的总结

     

    基本

    private, public, protected 访问标号的访问范围。

    private:只能由1.该类中的函数、2.其友元函数访问。

    不能被任何其他访问,该类的对象也不能访问。

     

    protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。

    但不能被该类的对象访问。

     

    public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,

    也可以由4.该类的对象访问。

     

    注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。

     

    类的继承后方法属性变化。

    private 属性不能够被继承。

    使用private继承,父类的protected和public属性在子类中变为private;

    使用protected继承,父类的protected和public属性在子类中变为protected;

    使用public继承,父类中的protected和public属性不发生改变;

     

    public

    protected

    private

    共有继承

    public

    protected

    不可见

    私有继承

    private

    private

    不可见

    保护继承

    protected

    protected

    不可见

     

     

    重要 注意点1

    访问控制是基于类的,不是基于对象的。

    这说明什么?

     这里 

    http://blog.codingnow.com/2010/03/cpp_protected.html

     

    友元

    友元函数及友元类可以访问类的私有成员

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11

    // 友元
    class A
    {
        friendvoid myf(A *pa);
        int a;
    };

    void myf(A *pa)
    {
        cout << pa->a << endl;
    }

     

    在派生类中的友元,只能给通过派生类访问基类的受保护成员

     

    重要 三种继承的意义(public/private/protected

    public继承表示——A是一种(is a)B

    private继承表示——A根据B实现(A is implemented in terms of B)

    protected继承没有什么物理上的意义

     

    vczh:

    private继承表示“A is a B”这个隐藏的属性只有A自己能依赖

    protecte表示"A is a B"这个隐藏的属性只有A和自己的子类能依赖

     

     

    来自 <https://www.zhihu.com/question/49046664>

     

     

     

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值