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

来源:互联网 发布:砸金蛋程序源码 编辑:程序博客网 时间:2024/05/18 06:37

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;}


2 0
原创粉丝点击