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.
原文地址:https://www.cnblogs.com/pityhero233/p/8146419.html