C/C++编程:protected的访问权限

  1. 在没有继承的情况下,protected跟private相同。在派生类的时候才出现分化

  2. 基类对象不能访问基类的protected成员,派生类中可以访问基类的protected成员。也就是说private成员是不能被继承的,只有public,protected的成员才可以被继承

  3. 只有在派生类中才可以通过派生类对象访问基类的protected成员

#include <iostream>
using namespace std;

class base {
public:
    base() {}
    virtual ~base() {}

protected:
    int int_pro;  // 基类可以访问自己所有的东西
};

class derived : public base {
public:
    derived() {}
    ~derived() {}

    void Print(derived &obj){obj.int_pro = 24;}
    //void Print(base &obj){obj.int_pro = 24;}
    void foo(){
        this->int_pro = 1;  // 这里访问m没有问题 ---> 继承了父类的protected
    }

};

int main()
{
    base *pBase = new base;
   // pBase->int_pro = 11; // 错误:‘int base::int_pro’是保护的  ---> 基类对象不能访问基类的protected成员

    derived *pderived = new derived;
  //  pderived->int_pro = 11;  // 自己的对象都不能访问,怎么可能让继承者访问
   
    delete pBase;

    return 0;
}

在这里插入图片描述

  • private: 只能被类成员函数及友元访问,不能被其他任何访问,本身的类对象也不行。
  • protected: 只能被类成员函数、子类函数及友元访问,不能被其他任何访问,本身的类对象也不行。
  • public: 能被类成员函数、子类函数、友元访问,也能被类的对象访问。
  • 派生类的成员和友元只能通过派生类对象访问基类的受保护成员,不能直接访问基类对象的受保护成员。如:
class Base{
protected:
    int val;
};

class Derived:public Base{
    friend void f1(Base&);
    friend void f2(Derived&);
};

void f1(Base &b) {b.val = 10;}   //错误,不能通过基类对象访问
void f2(Derived &d) {d.val = 10;}  //正确,可以通过派生类对象访问基类部分的protected