今天杨老师讲到C++的继承的时候用一个表来说明子类继承父类后访问权限的变化,如下表:

  

  注:在本类中,protected与private是相同的,但protected可以被继承,而private却不行。


  一看还真不好理解。在网上一搜,找到了一篇能够很形象说明这个表的文章(链接 http://blog.sina.com.cn/s/blog_4a1f4666010096ur.html

  “说到public、protected和private三个修饰符,刚学C++时,被教教材上的那个表搞得晕晕忽忽的。曾几时为了考试还去背过那个表,现在想想真是哭笑不得。后来用得多了,就发现其实就是很简单的道理。

  我们可以把一个类看作是一个人,类的数据成员看作是财产,而类的成员函数看作是对于财产的使用(包括花钱和挣钱)。

  如果这个人很担心别人使用自己的财产,那就将其据为私有(private),这样只有自己才可以使用私有财产,就连自己的子孙也无缘享用;不管是儿子以何种方式继承的,都是幌子,老子什么也没给你留。

  如果这个人还算大方点,有了将财产与子孙共享的想法,就将其保护(protected)起来,当然想法归想法,那还得看子孙们愿意不愿意继承这份财产了(一般是愿意的),如果儿子想独吞,即不想让财产再向自己的下一代传承,那他就将这部分保护的财产私有(private)继承下来,倘若儿子还想将其传承到自己的下一带甚至更远的子孙,那就保护(protected)继承或者公有(public)继承下来,这时的公有继承其实是个幌子,说的好听,但财产都保护起来了,公有继承和保护继承一个样,反正外人用不上;

  如果这个人很大方,我的就是大家的,那就干脆财产宣布公有(public),这样自己可以用,外人也可以用,当然儿子也可以用。但是这终归是老子的想法,儿子没法管老子,但儿子如果小心眼儿,不想让别人甚至是自己的子孙从自己这里享用(私用继承),或者只想让自己子孙从自己这里拿钱享用(保护继承),当然这只是儿子小心眼罢了,其实财产不能从他这里拿出,从他父亲那里照样可以拿得出。如果儿子想通了,干脆也公有继承下来,这样就像他父亲那样慷慨了。

  当然,以上所说的享用财产还有另一层意思,那就是使用后的情况,也就是说财产有进有出,和别人共享当然有挣有赔,不是说私有了就一定能赚大钱,而或许公有了挣得更多,只是说和别人共享后,就不是那么安全了!另外,如果管这个男人的人(一般是他老婆)很会打理,财产经过估量后,分情况对待,某些财产可以和别人一起使用,一起收益(public);某些财产是给子孙留的,只有自己和子孙一起使用,一起收益(protected);还有一部分财产是老两口子养老用的,自己使用(private)。至于儿子们是怎么继承的,那就看儿媳妇了,呵呵。其实程序员扮演的就是这里的老婆以及儿媳妇的角色。

  当然这个人使用财产的方式也是类似的情况,可以和别人共享,也可以不是;可以传承,也可以不是。

  总之,想和别人以及子孙共享,就公有;想和子孙共享,就保护;想自己使用,就私有。至于继承方式,那就看儿子的想法了,儿子能继承的部分也只有公有的和保护的,公有的那部分就完全教给儿子自己处理了,儿子想和别人以及子孙共享,就公有继承;想和子孙共享,就保护继承;想自己使用,就私有继承。继承的保护财产,儿子就没那么大的权利了,最多也就只能和自己的儿子共享(保护继承或公有继承),或者干脆自己使用(私有继承)。

C++继承中的public/protected/private的更多相关文章

  1. c/c++ 继承与多态 继承中的public, protected, private

    问题:类B私有继承类A,类A有个protected成员,那么在类B的成员函数里是否可以使用类A的protected成员? 可以使用. 估计有的同学说不对吧,类B都私有继承了类A了,怎么还能访问类A的p ...

  2. java中的public,protected,private权限修饰

    public和private基本没问题,主要是默认的和protected之间的区别 同一包中默认的和protected一样,所以来看看不同包的情况 看下如下代码,两个类位于不同包: public cl ...

  3. C++中public,protected,private派生类继承问题和访问权限问题

    C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...

  4. 【转载】C++中public,protected,private访问

    第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...

  5. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  6. C++:继承访问属性(public/protected/private)

    • 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...

  7. JAVA修饰符类型(public,protected,private,friendly)

    转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...

  8. C++ 类访问控制(public/protected/private)

    第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...

  9. JAVA类型修饰符(public,protected,private,friendly)

    JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...

随机推荐

  1. EBS并发程序监控

    SELECT s.* FROM fnd_concurrent_requests r, v$session v, v$sql s WHERE r.oracle_session_id = v.audsid ...

  2. 小米手机无法连接eclipse调试解决方案

    今天在做百度地图开发的时候,用genymotion调试一直出错,重启几次都是错的,后来我换成真机发现好了.当然我的小米3连接eclipse一直连不进去,折腾死我了,在网上查了很多资料,发现很多都不能用 ...

  3. Spark运行架构

    http://blog.csdn.net/pipisorry/article/details/52366288 1. Spark运行架构 1.1 术语定义 lApplication:Spark App ...

  4. EJB_开发EJB容器模型的WEB服务

    开发EJB容器模型的WEB服务 WEB服务 Web服务也是一种分布式技术,它与EJB最大的不同是,Web服务属于行业规范,可以跨平台及语言.而EJB属于Java平台的规范,尽管理论上可以跨平台,但实现 ...

  5. VMware虚拟化解决方案】如何选择虚拟化产品

    http://wangchunhai.blog.51cto.com/225186/1425557/ 拟化.云计算.大数据.智慧城市,是近期以及将来一段时间的热点.现在虚拟化产品很多,做虚拟化的公司也很 ...

  6. Android开发学习之路--UI之基本布局

    上一篇文章中主要介绍了ui的控件,这里就学习下布局吧.android的基本布局在layout下主要如图: 从上图可以看出有FrameLayout(单帧布局),LinearLayout(线性布局),Ta ...

  7. linux内核中默认logo的具体位置

    /driver/logo/... 以下这个目录下对应的是logo的设置

  8. JUI/DWZ介绍、简单使用

    简介 由于开发的项目使用JUI,所以学习了. DWZ富客户端框架(jQuery RIAframework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架.(现在更名为JUI) 可 ...

  9. MySQL数据库安装与配置详解(图文)

    接下来看一下如何安装mysql数据库. 由于有更详细的教程资源,因此参考别人的文章以整理.安装教程参考自博客园文章http://www.cnblogs.com/sshoub/p/4321640.htm ...

  10. CUDA command Profiler

    这里我不使用默认设置: timestamp gpustarttimestamp gpuendtimestamp gridsize threadblocksize dynsmemperblock sta ...