C++中protected的访问权限

转载,释然读C++ Primer 心中疑惑: http://www.cnblogs.com/harlentan/archive/2011/03/05/2006444.html

关于C++中protected的访问权限的讨论已经是一个很陈旧的话题了,陈旧到大家都不愿意去讨论,觉得他见到到吃饭睡觉那么自然。

我再次读《C++ Primer》的时候,其中关于protected 成员的描述是这样的:

protected Members

The protected access label can be thought of as a blend of private and public :

  • Like private members, protected members are inaccessible to users of the class.
  • Like public members, the protected members are accessible to classes derived from this class.
  • In addition, protected has another important property:
    A derived object may access the protected members of its base class only through a derived object. The derived class has no special access to the protected members of base type objects.

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

上面那段英文前两条都很好理解,基类对象不能访问基类的protected成员,派生类中可以访问基类的protected成员。也就是说private成员是不能被继承的,只有public,protected的成员才可以被继承。

就是最后一条有些迷惑人,派生类对象如果要访问基类protected成员只有通过派生类对象,派生类不能访问基类对象的protected成员。

请注意 drived class和drived object:派生类和派生类对象。第一点和第二点都是针对派生类来说的。

对于第三点总结一句话:只有在派生类中才可以通过派生类对象访问基类的protected成员。

举一个简单的例子:

[cpp] view plain copy

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6. Base(){};
  7. virtual ~Base(){};
  8. protected:
  9. int int_pro;
  10. };
  11. class A : public Base
  12. {
  13. public:
  14. A(){};
  15. A(int da){int_pro = da;}
  16. void Print(A &obj){obj.int_pro = 24;}
  17. void PrintPro(){cout << "The proteted data is " << int_pro <<endl;}
  18. };
  19. int main()
  20. {
  21. A aObj;
  22. A aObj2(5);
  23. aObj2.PrintPro();
  24. aObj.Print(aObj2);
  25. aObj2.PrintPro();
  26. //注释1
  27. //aObj.int_pro = 8;
  28. }

编译运行结果如下:

The protected data is 5

The protected data is 24

可见,在派生类内部直接访问protected成员和访问派生类对象基类的protected成员都是可行的。

但是若果解开注释1.就会编译报错。

很多书上都说有派生类的情况下protected的访问权限同public。这种说法是不对的,类内部直接访问没什么区别,但是访问对象基类的protected成员只能是在该类的内部。

我这里只列举了只有一层继承的情况,如果有多重继承的情况,比如三层。那么。中间层的类的内部还可以访问第三层类对象的基类成员,但是不能访问第三层类自己的protected的成员。

时间: 2024-10-25 05:51:34

C++中protected的访问权限的相关文章

C++中protected的访问权限 zz

关于C++中protected的访问权限的讨论已经是一个很陈旧的话题了,陈旧到大家都不愿意去讨论,觉得他见到到吃饭睡觉那么自然. 我再次读<C++ Primer>的时候,其中关于protected 成员的描述是这样的: protected Members The protected access label can be thought of as a blend of private and public : Like private members, protected members a

java类中修饰符public,protected等访问权限总结

public   protected  ……   private       类    +          +         +       +       包    +          +         +      继承   +         +      其他   + java类中修饰符public,protected等访问权限总结

如何在 Linux 中配置 sudo 访问权限

Linux 系统中 root 用户拥有 Linux 中全部控制权力.Linux 系统中 root 是拥有最高权力的用户,可以在系统中实施任意的行为. 如果其他用户想去实施一些行为,不能为所有人都提供 root 访问权限.因为如果他或她做了一些错误的操作,没有办法去纠正它. 为了解决这个问题,有什么方案吗? 我们可以把 sudo 权限发放给相应的用户来克服这种情况. sudo 命令提供了一种机制,它可以在不用分享 root 用户的密码的前提下,为信任的用户提供系统的管理权限. 他们可以执行大部分的

public,protected,private访问权限研究

结论1:一个类的public,protected和private成员(成员变量和成员函数)在另一个不相关类中的访问权限分别为可以访问,不可访问,不可访问 代码段1.1:Base.h文件 #ifndef BASE_H #define BASE_H class CBase { public: CBase(int o_public = 0, int o_protected = 0, int o_private = 0): m_public(o_public), m_protected(o_protec

Java 中关于default 访问权限的讨论

Java中关于成员变量访问权限问题一般书中会给出如下表格: 简单地描述一下表中的内容:用private 修饰的成员变量只能在类内部访问:用default修饰的成员变量可以再内部访问,也可以被同个包(同一目录)中的类访问:default修饰的成员变量既可以在类内部访问,又可以被同个包中的类访问,还能被子类访问:public可以被任何地方的类访问. 我们可以用隐私程度来表示各种修饰符的权限,即:private > default > protected > public.private .

angularjs中的页面访问权限设置

11月在赶一个项目,这阵子比较忙,挤挤时间更一篇博客吧,如标题所述说说在ng中页面访问权限控制的问题,水平有限各位看官见谅: 在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangDuangDuang的效果,后端搭建框架数据结构和数据交互(数据交互前后端有交集),不管是.net.java or php都能一对多的提供前端服务,然而在新形式下项目中运用了前端框架,开发情况就不一样了,比如我要说的这是在angular框架下完成的开发,模式是后端提供服务和api文档,页面和数据交互及

Android中的各种访问权限Permission含义

android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.FLASHLIGHT 访问闪光灯,android开发网提示HTC Dream不包含闪光灯 android.permission.FORCE_BACK 允许程序强行一个后退操

关于C++类中访问权限的若干疑问(虚函数访问权限)

下面这样一个程序:(以下程序都是在VS2010下实现) 1: class Base 2: { 3: public: 4: virtual void func() 5: { 6: cout<<"Base virtual func"<<endl; 7: } 8: }; 9: 10: class Derived: public Base 11: { 12: private: 13: virtual void func() 14: { 15: cout<<&

ADMT迁移之:在迁移过程中保留对源域资源的访问权限

之前发表过使用ADMT进行域对象迁移的文章,连接如下:http://blog.51cto.com/hubuxcg/1554925http://blog.51cto.com/hubuxcg/1554927最近再次使用ADMT进行域迁移时,碰到因SID筛选导致迁移后的用户无法访问源域中文件服务器问题,环境如下:源域:Contoso. Old 2008R2,新域:Contoso. Local 2008R2. 先来介绍下SID History,当在进行AD迁移或是重构时,SID History将在迁移或