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