zoukankan      html  css  js  c++  java
  • C++中class(类)与继承白话学习笔记

    1.class(类)

    class Drink{//定义饮料类
        public://public下面的东西可以被外面访问
            char* type;//饮料种类
            double price;//饮料价格
            double volume;//饮料体积
            double currentVolume;//饮料剩余体积
            bool isEmpty();//判是否喝完:成员函数(member function)
            void addDrink(double vol);//添加饮料:成员函数
         Drink();//初始化函数,用于初始化一杯饮料
            ~Drink();//析构函数,用于在不需要这杯饮料时销毁数据以节省空间
        private://private不能被访问
            double massOfIngredientA;//A成分的含量
            double massOfIngredientB;//B成分的含量
            double massOfIngredientC;//C成分的含量
    };//别忘了最后要加一个分号

    当我们需要描述一杯饮料的时候,我们可以如下使用Drink类:

    Drink a;//新建一个饮料对象
    printf("The Volume Of The Drink is %lf
    ",a.volume);

    2.public,private,protected的区别「引用」

    在C++中,作用域除了public,private还有protected。那这三者的区别到底是什么呢?

    先来看个示例,就明白了:

    #include<iostream>
    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; }

    再来看不是人看的话:

    1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:
    用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。
    2.类的另一个特征就是继承,protected的作用就是实现这一目的。所以:
    protected成员可以被派生类对象访问,不能被用户代码(类外)访问。

    3.继承

    继承,顾名思义,就是一个东西把另一个东西的传统保留下来。

    我想要描述一个雪碧对象,雪碧(Sprite)和饮料(Drink)有很多相似之处,我不想重复写代码,于是让Sprite对象继承Drink对象的属性。

    class Sprite:public Drink
    {
           public:
               bool hasBubbles();//返回是否有气          
    }

    此处的冒号代表继承。

    现在的Sprite对象除了拥有Drink的全部属性(volume,currentVolume,price,massOfIngredientA等),还有了独有的属性(hasBubble());

    Q:那么冒号后的public代表什么用法呢?

    先看看定义:

    继承中的特点:
    先记住:不管是否继承,上面的规则永远适用!
    有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成员可以被派生类访问。

    接下来是三个例子:

      3.1 public继承

      

    #include<iostream>
    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;
    }

      3.2 protected继承

    #include<iostream>
    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.3 private继承

    #include<iostream>
    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;
    }

    现在你明白了吗?

    引用:深入理解C++中public、protected及private用法:http://www.jb51.net/article/54224.htm

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 No sacrifice , no victory.
  • 相关阅读:
    MySQL锁之三:MySQL的共享锁与排它锁编码演示
    服务链路追踪(Spring Cloud Sleuth)
    服务网关zuul之四:zuul网关配置
    hdu 1505 City Game (hdu1506加强版)
    PHP设计模式——訪问者模式
    极客互联网电视不是噱头,用户体验成创维G7200核心竞争力
    深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手
    使用php分页类实现简单分类
    管理之路(四)
    poj 2485 Highways (最小生成树)
  • 原文地址:https://www.cnblogs.com/pityhero233/p/8146419.html
Copyright © 2011-2022 走看看