1、访问控制中有三种角色:基类及其友元,派生类,类用户(对象);访问说明符分为public/protected/private,类的成员也相应的分为了3种。
 
2、访问说明符又分为两种:一个是基类中的成员访问说明符;另一个是派生类派生列表中的访问说明符。
 
3、以上两种访问说明符把类的成员分成了分为了6种:派生类中的public/protected/private成员;派生类的public/protected/private基类及其成员。
 
4、接下来我们梳理一下三种角色对上述成员的访问权限。
 
    4.1 我们假设只有一个基类,那么它的成员有public/protected/private三种。访问关系如下表:(有权限简称有,无权限简称无)
 
 
public成员
protected成员
private成员
基类及其友元
有
有
有
派生类及其友元
有
有
无
类用户
有
无
无
 
  具体来说就是:1)基类本身及其友元对基类中任何成员都有访问权限;
                       2)派生类及派生类的友元可以通过派生类的对象访问基类中受保护的成员,对private成员无访问权限;
                       3)类用户(由基类定义的对象)只能访问基类中的public成员。
 
    4.2 加上派生列表中的访问说明符之后,访问的成员加上了派生类的基类,然后,我们看访问权限有什么变化?
 
    1)派生列表后的访问说明符相当于说明了基类属于派生类的成员类型,举个例子来说,Class D:public B,那么基类B就相当于D中的public成员,但是需要注意的一点就是,基类中的成员仍然受到基类中的访问说明符的控制,也就是说,尽管B是public的,但是B中的private成员D仍然没有权限进行访问。
    2)因为类及其友元可以访问本身所有数据成员,所以派生访问说明符对于派生类的成员(及其友元)能否访问其直接基类的成员没有什么影响;所造成的不同点就在于派生类的派生类和派生类的对象访问权限会有所不同,这时候可以把基类看作是派生类中的成员。
总结起来就有如下表:
 
 
派生类public
派生类protected
派生类private
public基类
protected基类
private基类
派生类及其友元
有
有
有
无影响
无影响
无影响
派生类的派生类及其友元
有
有
无
无影响
无影响
无
派生类用户
有
无
无
无影响
无
无
 
 
5、派生类向基类转换的可访问性:能否转换的关键就是基类的公有成员是否对派生类的某种角色(派生类及其友元、派生类的用户,派生类的派生类及其友元)是否是可访问的,如果可以访问,就可以转换;换句话说,如果当前的角色能够使用基类中的公有成员,那么就是可以转换的。
 
6、关于友元:
1)友元关系不能继承,是基类的友元,如果不声明的话,就不是派生类的友元,也就不能访问派生类的成员。
2)基类的友元可以访问基类中的成员以及派生类中的基类部分。
 
7、当然成员的可访问性也不是一成不变的,使用using声明就可以改变其访问性,但是还受到成员访问说明符的制约。
 
8、struct和class的唯一区别就在于默认的访问权限不同,最好还是显示声明访问权限。
 

[C++] 访问控制与继承详解的更多相关文章

  1. 「万字图文」史上最姨母级Java继承详解

    摘要:继承是面向对象软件技术中的一个概念.它使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用. 本文分享自华为云社区<「万字图文」史上最姨母级Java继承详解丨[奔跑吧!JAVA] ...

  2. [原创]JavaScript继承详解

    原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...

  3. “全栈2019”Java第九十九章:局部内部类与继承详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. 第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解

    第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解 一.    引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类 ...

  5. CSS样式表继承详解

    最近在恶补css样式表的基础知识.上次研究了css样式表之冲突问题详解 .这次是对 css 继承 特性的学习. 什么是css 继承?要想了解css样式表的继承,我们先从文档树(HTML DOM)开始. ...

  6. Kotlin——从无到有系列之中级篇(四):面向对象的特征与类(class)继承详解

    如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 在前面的章节中,详 ...

  7. JavaScript继承详解

    面向对象与基于对象 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则是类的一个具体实现. 我们还知道,面向对象编程有三个重要的概念 - 封装.继 ...

  8. Java继承详解

    目录 前言 继承的格式: 继承的特点: 继承的优缺点 继承的注意点(重要) 继承的使用 前言 类是对对象的抽象,具有共同属性和行为的许多对象抽象出一个类. 例如:有三个学生小明,小红,小李都有姓名,年 ...

  9. JavaScript继承详解(五)

    在本章中,我们将分析John Resig关于JavaScript继承的一个实现 - Simple JavaScript Inheritance. John Resig作为jQuery的创始人而声名在外 ...

随机推荐

  1. spring data jpa 的使用

    使用spring data jpa 开发时,发现国内对spring boot jpa全面介绍的文章比较少案例也比较零碎,因此写文章总结一下. spring data jpa介绍 首先了解JPA是什么? ...

  2. 史上最全面的SignalR系列教程-6、SignalR 实现聊天室

    1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...

  3. 学习js都学习什么?

    前言:js(javaScript)是面向对象(OOP)的编程语言,目前不仅仅是客户端语言了,基予node可以做服务器端程序,那我们学习js都学习什么? 学习js,我们学习它的几部分组成 1.ECMAS ...

  4. HDU 5135

    题意略. 思路: 本题开始我先写了一发dfs暴力,然而递归程度太深,导致爆栈.仔细回想一下dfs的过程,发现最不好处理的就是每收集到3个木棍,才能构成一个三角形. 并且,还有一个隐患就是不能完全枚举出 ...

  5. 多线程环境中安全使用集合API(含代码)

    转自: http://blog.csdn.net/ns_code/article/details/17200509 在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于 ...

  6. 第一篇 特征提取以及openvslam中的相关实现详解

    参考尺度空间理论 金字塔 当用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度.所以在很多时候,我们会在将图像 ...

  7. [工具使用]-利用latex管理创建自己的ACM模板

    从很早入坑ACM开始,便和各种算法的模板打着交道,虽然kaungbin的模板已经足够强大,但是自己在平常做题中也逐渐有着自己的一些模板,也有一些kuangbin模板中没有的更快的板子,虽然不确定时候以 ...

  8. Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)

    一.背景 在我上一篇文章<Spring Cloud开发人员如何解决服务冲突和实例乱窜?>中提到使用服务的元数据来实现隔离和路由,有朋友问到能不能直接通过IP来实现?本文就和大家一起来讨论一 ...

  9. c# autofac结合WebApi的使用

    一.下载相关类库引用 install-package Autofac install-package Autofac.Mvc4 install-package Autofac.WebApi2 二.配置 ...

  10. 玲珑杯”ACM比赛 Round #18 A -- 计算几何你瞎暴力(瞎暴力)

    题目链接:http://www.ifrog.cc/acm/problem/1143?contest=1020&no=0 题解:就是瞎暴力具体多暴力看一下代码就知道了. #include < ...