C++中protected访问权限问题

今天发现有这样两句话:

  1. 基类的保护成员对于派生类的成员是可访问的。
  2. 派生类的成员只能通过派生类对象访问基类的保护成员,派生类对一个基类对象中的受保护成员没有访问权限。

这两句话看的太头晕了,其实作者应该是想表达:只有在派生类体内,才可以通过派生类对象,访问基类的protected成员。看这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Base
{
public:
Base();
private:
void foo();
protected:
int m;
};

class Derive : public Base
{
public:
Derive();
};
Derive::Derive()
{
this->m = 1; // 这里访问m没有问题
}

使用类的代码:

1
2
Derive *d = new Derive();
std::cout<< d->m <<endl; // 这里就报错了

总结一下三个关键字的访问范围:

  • private: 只能被类成员函数及友元访问,不能被其他任何访问,本身的类对象也不行。
  • protected: 只能被类成员函数、子类函数及友元访问,不能被其他任何访问,本身的类对象也不行 也就是说protected比private多了个子类函数
  • public: 以上所说全能访问

还是上面的两个类,只看public和private,如下代码:

1
2
3
4
Base *b = new Base();
b->test_pub(); // 通过
b->foo(); // 报错
std::cout<< b->m; // 报错

protected继承和private继承能降低访问权限:

  • 使用private继承,父类的protected和public属性在子类中变为private

  • 使用protected继承,父类的protected和public属性在子类中变为protected

  • 使用public继承,父类中的protected和public属性不发生改变