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 成员的更多相关文章

  1. java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问

    在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...

  2. C++中的public、private、protected成员继承问题

        我是C++菜鸟,刚学了一点C++. 先看例子1: /* Item.h */ #include <iostream> #include <string> class It ...

  3. C#派生类中使用基类protected成员的方法

    我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被prot ...

  4. Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限

    一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...

  5. C# 成员默认访问权限(public、private、protected、internal)

    C# 成员默认访问权限(public.private.protected.internal) 来源 https://www.cnblogs.com/yezongjie/p/20181121Access ...

  6. C++ primer(十三)--类继承、构造函数成员初始化、虚函数、抽象基类

    一.基类     从一个类派生出另一个类时,原始类称为基类,继承类称为派生类. 派生类对自身基类的private成员没有访问权限,对基类对象的protected成员没有访问权限,对派生类对象的(基类之 ...

  7. 转载:看c++ primer 学习心得

    学习C++ Primer时遇到的问题及解释 chenm91 感觉: l          啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...

  8. C++primer原书中的一个错误(派生类using声明对基类权限的影响)

    在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...

  9. C++ Primer 有感(面向对象编程)

    1.除了构造函数之外,任意非static成员函数都可以是虚函数.保留字virtual只在类内部的成员函数声明处出现,不能用在类定义体外部出现的函数定义上. 2.派生类只能通过派生类对象访问其基类的pr ...

随机推荐

  1. 默认选择radio的第一个

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Hibernate4+Spring JPA+SpringMVC+Volecity搭建web应用(一)

    pom.xml配置 <dependencies> <!-- hibernate begin --> <dependency> <groupId>org. ...

  3. ztree edit_super

    <SCRIPT type="text/javascript"> var setting = { view : { addHoverDom : addHoverDom, ...

  4. 20145236 冯佳 《Java程序设计》第2周学习总结

    20145236 <Java程序设计>第2周学习总结 教材学习内容总结 一.Java的基本类型. 在Java中的基本类型主要可区分为整数.字节.浮点数字符与布尔. •整数: 类型 长度 范 ...

  5. I-MooFest(POJ 1990)

    MooFest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5697   Accepted: 2481 Descripti ...

  6. Tomcat编码问题

    在Tomcat7中,默认URIEncoding="iso8859-1",get请求由于url会完全出现在地址栏,所以传递中文到后台会乱码,需要改成URIEncoding=" ...

  7. kafka consumer属性

    consumer属性 group.id:指定consumer group的唯一标识. consumer.id:唯一标识consumer.默认值为null,不指定时会自动生成. zookeeper.co ...

  8. urlencode在url中的作用

    urlencode编码能解决特殊字符的传输问题. 使用urlencode主要用于正常识别输入的汉字.空格以及其他特殊字符. 列如: 一产品名称为A&T Plastic,在产品列表中就产生了这样 ...

  9. MVC3+EF4.1学习系列(五)----- EF查找导航属性的几种方式

    文章索引和简介 通过上一篇的学习 我们把demo的各种关系终于搭建里起来 以及处理好了如何映射到数据库等问题 但是 只是搭建好了关系 问题还远没有解决 这篇就来写如何查找导航属性 和查找导航属性的几种 ...

  10. weblogic被锁解决方案

    weblogic被锁,无法启动. 解决方案:http://blog.csdn.net/zhengqiqiqinqin/article/details/17025741