zoukankan      html  css  js  c++  java
  • C++中public、protected及private使用方法

    1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:

    用户代码(类外)能够訪问public成员而不能訪问private成员;private成员仅仅能由类成员(类内)和友元訪问。

    2.类的还有一个特征就是继承。protected的作用就是实现这一目的。所以:

    protected成员能够被派生类对象訪问,不能被用户代码(类外)訪问。

    现来看看例如以下演示样例:

    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
    29
    30
    31
    32
    33
    34
    #include<iostream>
    #include<assert.h>
    using namespace std;
    class A{
    public:
      int a;
      A(){
        a1 = 1;
        a2 = 2;
        a3 = 3;
        a = 4;
      }
      void fun(){
        cout << a << endl;    //正确
        cout << a1 << endl;   //正确
        cout << a2 << endl;   //正确,类内訪问
        cout << a3 << endl;   //正确,类内訪问
      }
    public:
      int a1;
    protected:
      int a2;
    private:
      int a3;
    };
    int main(){
      A itema;
      itema.a = 10;    //正确
      itema.a1 = 20;    //正确
      itema.a2 = 30;    //错误,类外不能訪问protected成员
      itema.a3 = 40;    //错误,类外不能訪问private成员
      system("pause");
      return 0;
    }

    继承中的特点:

    先记住:无论是否继承,上面的规则永远适用。

    有public, protected, private三种继承方式,它们对应地改变了基类成员的訪问属性。

    1.public继承:基类public成员。protected成员,private成员的訪问属性在派生类中分别变成:public, protected, private

    2.protected继承:基类public成员,protected成员,private成员的訪问属性在派生类中分别变成:protected, protected, private

    3.private继承:基类public成员,protected成员。private成员的訪问属性在派生类中分别变成:private, private, private

    但不管哪种继承方式,上面两点都没有改变:

    1.private成员仅仅能被本类成员(类内)和友元訪问,不能被派生类訪问

    2.protected成员能够被派生类訪问

    再来看看下面代码:

    1.public继承

    代码例如以下:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include<iostream>
    #include<assert.h>
    using namespace std;
      
    class A{
    public:
      int a;
      A(){
        a1 = 1;
        a2 = 2;
        a3 = 3;
        a = 4;
      }
      void fun(){
        cout << a << endl;    //正确
        cout << a1 << endl;   //正确
        cout << a2 << endl;   //正确
        cout << a3 << endl;   //正确
      }
    public:
      int a1;
    protected:
      int a2;
    private:
      int a3;
    };
    class B : public A{
    public:
      int a;
      B(int i){
        A();
        a = i;
      }
      void fun(){
        cout << a << endl;       //正确,public成员
        cout << a1 << endl;       //正确,基类的public成员,在派生类中仍是public成员。

        cout << a2 << endl;       //正确。基类的protected成员,在派生类中仍是protected能够被派生类訪问。
        cout << a3 << endl;       //错误,基类的private成员不能被派生类訪问。
      }
    };
    int main(){
      B b(10);
      cout << b.a << endl;
      cout << b.a1 << endl;   //正确
      cout << b.a2 << endl;   //错误,类外不能訪问protected成员
      cout << b.a3 << endl;   //错误,类外不能訪问private成员
      system("pause");
      return 0;
    }

    2.protected继承:

    代码例如以下:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include<iostream>
    #include<assert.h>
    using namespace std;
    class A{
    public:
      int a;
      A(){
        a1 = 1;
        a2 = 2;
        a3 = 3;
        a = 4;
      }
      void fun(){
        cout << a << endl;    //正确
        cout << a1 << endl;   //正确
        cout << a2 << endl;   //正确
        cout << a3 << endl;   //正确
      }
    public:
      int a1;
    protected:
      int a2;
    private:
      int a3;
    };
    class B : protected A{
    public:
      int a;
      B(int i){
        A();
        a = i;
      }
      void fun(){
        cout << a << endl;       //正确,public成员。

        cout << a1 << endl;       //正确,基类的public成员,在派生类中变成了protected,能够被派生类訪问。
        cout << a2 << endl;       //正确。基类的protected成员,在派生类中还是protected,能够被派生类訪问。
        cout << a3 << endl;       //错误,基类的private成员不能被派生类訪问。
      }
    };
    int main(){
      B b(10);
      cout << b.a << endl;       //正确。public成员
      cout << b.a1 << endl;      //错误,protected成员不能在类外訪问。
      cout << b.a2 << endl;      //错误,protected成员不能在类外訪问。
      cout << b.a3 << endl;      //错误,private成员不能在类外訪问。
      system("pause");
      return 0;
    }

    3.private继承:

    代码例如以下:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include<iostream>
    #include<assert.h>
    using namespace std;
    class A{
    public:
      int a;
      A(){
        a1 = 1;
        a2 = 2;
        a3 = 3;
        a = 4;
      }
      void fun(){
        cout << a << endl;    //正确
        cout << a1 << endl;   //正确
        cout << a2 << endl;   //正确
        cout << a3 << endl;   //正确
      }
    public:
      int a1;
    protected:
      int a2;
    private:
      int a3;
    };
    class B : private A{
    public:
      int a;
      B(int i){
        A();
        a = i;
      }
      void fun(){
        cout << a << endl;       //正确,public成员。

        cout << a1 << endl;       //正确,基类public成员,在派生类中变成了private,能够被派生类訪问。

        cout << a2 << endl;       //正确,基类的protected成员,在派生类中变成了private,能够被派生类訪问。

        cout << a3 << endl;       //错误。基类的private成员不能被派生类訪问。
      }
    };
    int main(){
      B b(10);
      cout << b.a << endl;       //正确。public成员
      cout << b.a1 << endl;      //错误,private成员不能在类外訪问。
      cout << b.a2 << endl;      //错误, private成员不能在类外訪问。

      cout << b.a3 << endl;      //错误。private成员不能在类外訪问。

      system("pause");
      return 0;
    }

    通过以上的代码都备有较为详尽的凝视,读者应该可以理解。细致看代码中派生类B中定义了和基类同名的成员a。此时基类的a仍然存在,可以验证。

    1
    2
    3
    4
    5
    6
    7
    int main(){
      cout << sizeof(A) << endl;
      cout << sizeof(B) << endl;
      
      system("pause");
      return 0;
    }

    输出:

    16

    20

    所以派生类包括了基类全部成员以及新增的成员,同名的成员被隐藏起来。调用的时候仅仅会调用派生类中的成员。

    假设要调用基类的同名成员。能够用下面方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(){
      
      B b(10);
      cout << b.a << endl;
      cout << b.A::a << endl;
      
      system("pause");
      return 0;
    }

    输出:

    10

    4

  • 相关阅读:
    Python3之format
    xml文件整理
    某系统采集2018
    sublime+python3 中文环境
    python3文本读取与写入常用代码
    redis3.0集群使用发现的一些问题
    mysql字符集
    redis3.0集群搭建
    安装Maven、nexus
    一键安装mysql5.6
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5365554.html
Copyright © 2011-2022 走看看