C++继承中的public/protected/private
今天杨老师讲到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的更多相关文章
- c/c++ 继承与多态 继承中的public, protected, private
问题:类B私有继承类A,类A有个protected成员,那么在类B的成员函数里是否可以使用类A的protected成员? 可以使用. 估计有的同学说不对吧,类B都私有继承了类A了,怎么还能访问类A的p ...
- java中的public,protected,private权限修饰
public和private基本没问题,主要是默认的和protected之间的区别 同一包中默认的和protected一样,所以来看看不同包的情况 看下如下代码,两个类位于不同包: public cl ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- 【转载】C++中public,protected,private访问
第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...
- 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意
大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...
- C++:继承访问属性(public/protected/private)
• 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...
- JAVA修饰符类型(public,protected,private,friendly)
转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...
- C++ 类访问控制(public/protected/private)
第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...
- JAVA类型修饰符(public,protected,private,friendly)
JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...
随机推荐
- Linux 高性能服务器编程——高性能服务器程序框架
问题聚焦: 核心章节. 服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...
- #pragma pack(x) CPU对齐
编译器会尽量把成员对齐以提高内存的命中率.对齐是可以更改的,使用"#pragma pack(x)" 可以改变编译器的对齐方式. C++固有类型的对界取编译器对齐方式与自身大小中较小 ...
- /proc/stat 详解
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率.这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻. cat /proc/stat cpu 6 ...
- 下载Android源代码编译错误总结
错误1: prebuilts/sdk/api/18.txt:22055: error 9: Removed public method android.telephony.gsm.SmsMessage ...
- android 网络连接 HttpGet HttpPost方法
1.本文主要介绍利用HttpGet和HtppPost方法来获取网络json数据. 代码如下: public HttpData(String Url,HttpGetDataListener listen ...
- 带你深入理解STL之Set和Map
在上一篇博客带你深入理解STL之RBTree中,讲到了STL中关于红黑树的实现,理解起来比较复杂,正所谓前人种树,后人乘凉,RBTree把树都种好了,接下来就该set和map这类关联式容器来" ...
- Jetty 嵌入式启动官方完整教程
网上太多了,不如直接看官方的这个全面. http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty 入门地址: http://wiki.eclipse ...
- SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式
这对时间在学习SSH中Spring架构,Spring的事务配置做了详细总结,在此之间对Spring的事务配置只是停留在听说的阶段,总结一下,整体把控,通过这次的学习发觉Spring的事务配置只要把思路 ...
- 【一天一道LeetCode】#263. Ugly Number
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Write a ...
- UNIX环境高级编程——线程属性之分离属性
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的. 我们知道,进程中的线程可以调用: int pthread_join(pthread_t tid, v ...