C++ Primer---- 奇怪的protected 成员

protected 成员在 C++ Primer 第四版中有如下描述:

可以认为 protected 标号是 private 和 public 的混合:

  1. 像 private 成员一样, protected 成员不能被类的用户访问。

  2. 像 public 成员一样, protected 成员可被该类的派生类访问。

此外, protected 还有另一个重要性质:

  3. 派生类只能通过派生类对象访问其基类的 protected 成员, 派生类对其基类类型对象的 protected 成员没有特殊的访问权限。


前两点比较好理解: 基类希望 protected 成员能够被派生类访问,但是又不希望类的用户访问, 所以 protected 成员的被访问权限介于 public 和 private 之间。

第三点,读起来总是感觉很绕,不知所云。

其实是以下的这个意思:

在派生类的定义中:可以通过派生类的对象访问 这个派生类对象的 protected 成员, 而不能通过基类的对象直接访问 protected 成员。。

注意, *this 其实也是一个派生类对象(它绑定了当前的派生类对象),所以在派生类定义中,可以直接访问本对象的基类的 protected 成员。

class Derivative :...  Base{

..................派生类中

}


不知道大家理解没有?? 看了下面的例子,想必大伙就能明白了。。


/**
 * @file protected-member.cc
 * @brief test usage of protected member
 * @author shoulinjun@126.com
 * @version 0.1.00
 * @date 2014-03-19
 */
#include <iostream>
using namespace std;

class Base{
public:
    Base(int x=0): pro(x){}
protected:
    int pro;
};

class Derivative : public Base{
public:
    Derivative(int x=0): Base(x) {}
    void Print(Derivative &d, Base &b){
        cout << "this->protected: " << pro << endl;
        cout << "d.protected: " << d.pro << endl;

        // error not allowed to access base.pro
        // cout << "b.protected: " << b.pro << endl;
    }
};

int main(void)
{
    Base b(0);
    Derivative d1(1), d2(2);

    d1.Print(d2, b);

    // error
    // cout << b.pro << endl;
    // cout << d1.pro << endl;

    return 0;
}


C++ Primer---- 奇怪的protected 成员,布布扣,bubuko.com

C++ Primer---- 奇怪的protected 成员

上一篇:web程序设计


下一篇:java基础之——类的初始化顺序