一个程序说明C++中public,protected和private继承的问题

一个程序讲解C++中public,protected和private继承的问题

#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;    //正确,本类可以访问本类的pubil成员;
    cout << a1 << endl;   //正确,本类可以访问本类的pubil成员;
    cout << a2 << endl;   //正确,本类可以访问本类的protected成员,在类内部可以被访问,在类外部不能使用类的对象进行访问,需要使用类的pubilc成员函数进行访问;
    cout << a3 << endl;   //正确,本类可以访问本类的private成员,在类内部可以被访问,在类外部不能使用类的对象进行访问,需要使用类的pubilc成员函数进行访问;
  }
  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成员不能被派生类访问。
  }
};

class C : protected A{
  public:
   int a;
  C(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成员不能被派生类访问。
  }
};

class D : private A{
  public:
   int a;
  D(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;
      cout << b.a1 << endl;      //正确,public成员可以被类的对象调用
   // cout << b.a2 << endl;      //错误,类外不能通过对象访问protected成员
   // cout << b.a3 << endl;      //错误,基类的private成员不能被派生类访问

     C c(10);
       cout << c.a << endl;     //正确。public成员可以被类的对象调用
   //cout << c.a1 << endl;      //错误,类外不能通过对象访问protected成员
   //cout << c.a2 << endl;      //错误,类外不能通过对象访问protected成员
   //cout << c.a3 << endl;      //错误,基类的private成员不能被派生类访问

      D d(10);
        cout << d.a << endl;    //正确。public成员可以被类的对象调用
   //cout << d.a1 << endl;      //错误,类外不能通过对象访问private成员
   //cout << d.a2 << endl;      //错误, 类外不能通过对象访问private成员
   //cout << d.a3 << endl;      //错误,基类的private成员不能被派生类访问
   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
除public成员以外,其他的成员都不能用类的对象进行调用(在类外被调用),但是其他成员可以通过定义在pubilc区域的内的成员函数进行调用。
需要注意的一点是,基类(即父类)的private成员,无论在继承类内还是外,都无法被访问。

猜你喜欢

转载自blog.csdn.net/qq_39777550/article/details/88890630