了解C++的封装、继承和多态

来源 :电脑报 | 被引量 : 0次 | 上传用户:fzzlz
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  近期重新看了一下C++,一是感觉清晰了许多,二是觉得若是换个角度看的话,会有不一样的体会,并且也容易记住C++中的一些特性。本文就试图将集合论中的相关知识引入到C++的封装、继承、多态上,让我们对它有个新的认识。
  一、封装
  C语言中,代码之间的关系都是函数式的调用。这里面牵扯到对数据的操作,若操作的都是局部变量,那一切都太平了。但若是几个函数操作同一个非局部变量,考虑到模块化,那么就要将变量和操作变量的函数整合在一起,这就是C++中的封装。
  C++里面引入了class的概念,目的是封装数据和数据上的操作,使其成为一个独立的模块。若是将这个独立的模块(代码和数据)想象成集合,那个class A的集合为:
  此时若再引入一个class B,则有下面四种可能性,情况三、四实际上类似。
  情况一,只需要封装就足够了。处理情况二、三、四时,为了考虑代码共享,需要引入继承机制。
  二、继承
  我们先考虑情况二,由于A和B有公共代码(成员函数或者是成员变量),故通常考虑将公共的部分定义为class C,然后由A、B去继承它。
  对于情况三、四,我们不需要演变,直接让A继承B,或者B继承A即可。
  若此时引入class D,那么情况就会复杂很多。简单起见,以情况二为扩展,考虑添加class D后的某一种。后续你会发现,情况三、四类似。
  此时,最合理的方式是引入四個类,class E, class F, class G, class H。E为基类,F、G、H为一级子类、A、B、D为二级子类。
  但是,这种解决方案有问题:
  1.若是再添加class I,class J,那复杂度就可想而知了。
  2.虽然代码冗余是消除了,但是引入了四个类,也着实有点多,更严重的话会导致“类泛滥”。
  为了能统一解决添加的类D,我们将图四拆分成D和A,以及D和B的关系。这样就转化为图2中的一种:情况二。
  图6中,class H表示D和A的公共部分,class G表示D和B的公共部分。此种解法虽然有代码冗余,但简单了许多,事实上,我们很多时候处理类,就是这么处理的。
  在这种情况下,若是添加class I,class J,都可以转化为新添加类和已有类之间的单独关系,即图2中的四种情况。
  同时,也可以发现,我们无法在类的继承结构中完全消除代码冗余,原因是多个类的情况下,实在是比较复杂。
  当我们在使用这些包含继承结构的类的时候,考虑图2的情况三,若B继承自A,那么实际上B也可以当A用的,这很好理解,本来A就是B的一部分。但若是想让A代表B呢(实际上就是B对象,只是用的时候当A用),为了完美解决这个问题,就要引入多态了。
  三、多态
  由前面的分析可知,类之间的关系都可以简化为图2的情况。图2的情况三中,A当B用(实际上只有B对象)又分为以下三种情况。第三种情况有点别扭,可能是需求决定的吧。
  1.使用B中的A部分。直接使用A操作即可。
  2.使用B中的非A部分。需要将A转化为B才可使用。
  3.B覆盖定义A的公共接口或者成员变量。当B作为A使用的时候,A中的公共接口或者成员变量是在非A中的,实现这一机制的就是多态。
  C++中,基类定义虚函数,子类可以重新实现它,以实现多态。令人奇怪的是,没有虚成员变量的概念,我觉得可能有以下几个原因:
  1.没必要提供虚成员变量。父类的成员变量属于存储空间,可以直接用。不像函数,属于代码无法直接替换。
  2.可能编译器要实现这个会比较复杂吧。
  3.封装的概念是少暴露成员变量,只暴露接口。因此,好的类的设计是没有公共的成员变量的,也就不存在虚成员变量一说了。但是,从完整性的角度而言,应该提供虚成员变量的。
其他文献
最近,MI时常会听着《老男孩》来怀念自己的大学生活。走出学校,踏入社会,无疑成了人生的一个分水岭,长大一岁就意味着老气横秋了么?看看设计师Young-Gun Cho是如何找回童年的感觉。    关于Young-Gun Cho  人的创造力就是保留一份童趣和童心,这句话很适用于Young-Gun Cho。这位来自韩国首尔的设计师,不仅仅在生活中像一个老男孩,还将这份童趣融入自己的设计中。远离尘世的喧
期刊
这两天,高考成绩查询陆续开放,具体查分时间和入口可访问中国教育网(https://www.eol.cn/e_html/gk/chafen/index.shtml)。随后考生们就会面临一个世纪难题:志愿怎么填?  也许这个问题,好几万字都说不完,每个学校、每个考生都有各自的不同,这其中还得靠经验来判断。而这些当然是过来人最清楚,而且还必须是近几年刚好经历过这一流程的人。  刚好有一位来自上海交大英语
期刊
学校和单位经常要打印奖状、荣誉证书等文件,而且动辄就是几十份甚至数百份,这些文件的主题大致相同,但需要在姓名、称号等部分作出改变,常规的做法就是生成一个模板,难后逐一修改名称、称号,可这样做不仅工作量大,而且还容易发生错误,其实这种批量文件打印完全可以简单完成。  首先打开Excel电子表格并建立文件,电子表格中主要包含这些批量文件中的不同部分,如在学校的奖状打印中,可以建立班级、获奖人、获奖项目
期刊
去年OPPO首次推出的K系列成为市场上的一匹黑马,几乎没什么营销投入的情况下,却在市场上表现抢眼。此次OPPO K2首次开售2小时内,便登顶天猫平台全价位销量冠军,京东平台1000~2000元价位销量冠军。  作为K系列的第二款机型,今年OPPO在K3上明显加大了力度,各种预热和发布会造势,官方“硬核少年”的定位,意图已经很明显了:针对年轻市场推出的高性价比机型。  专为年轻人打造  所谓“拿得起
期刊
全球NAND闪存市场大环境下NAND价格依然在下滑,三星、东芝、西数、美光等公司的营收及盈利因此大受影响,而东芝位于日本四日市的NAND工厂日前出现了断电事故,此事有可能对全球NAND闪存价格产生重要影响。也就是说,全球闪存市场很可能因此变天,想要购买的朋友对于闪存的相关信息必须关注起来了。  到底谁在影响闪存价格?  在购买之前,还得了解一下目前闪存市场价格变化的根源。半导体制造工厂有其特殊性,
期刊
在日常文件编辑中,白领经常会有这样的要求:将一篇文章分成几个文件,或是将几个文件中的内容合并在一起,形成一篇文章。为达到这个目的,最简单的办法自然是新建文档,然后复制粘贴,可如果要分离或合并的文件过大,那这样操作就是個大工程,能否有其他方法来简单实现呢?  文件拆分  启动Word,打开“视图”菜单,在“视图”菜单中,选择“大纲”,进入大纲模式,随后点击需要分页的首行前的小圆点,这一行就会被选中。
期刊
天气变热后,蚊虫就开始肆虐了,前段时间师姐一直在研究怎么对付蚊子,今天师姐终于有机会来怒杀蟑螂了!如果你家也是一个蟑螂窝,那今天师姐安利的这款神药你一定要Get。  除蟑螂界的扛把子来啦  蟑螂叫小强的原因大家都知道,怎么打都打不死,据说打死一只还会留下许多蟑螂卵。所以用拖鞋踩蟑螂的小可爱们记得踩完拖地板和水冲鞋子(真skr鬼故事...),如果想彻底消灭蟑螂的尸体,只能用火烧,但这只能见到一只消灭
期刊
144Hz电竞屏这个概念对于很多朋友来说都不陌生,毕竟现在随处可见的电竞显示器广告上都会提到。不过,对于大多数玩家来说,只是听说高刷新率显示器用起来爽,但是自己没有体验过,于是就认为那只是商家的吹嘘而已。而对于发烧级玩家来讲,144Hz的游戏体验真的是用过就回不去,再要他们去适应60Hz的普通显示器简直就是折磨。那么,到底这样的游戏电脑好在哪里呢?趁着最近硬件价格走势喜人,想组装144Hz游戏电脑
期刊
江西抚州,孕育出王安石、汤显祖、曾巩等名人,美其名曰:江右古郡;  辽宁锦州,充满生活气息的海边小城,风月无边,又享有“海上锦州”的美誉。  一个历史名城,一个海岸重镇,如今却在这相距1800多公里的两地,同时上演着与其文化氛围极不相称的相同的命运浮沉挣扎故事……  王勇,土生土长的抚州人,靠一身厨艺养家,见人就笑,用浓浓的江西口音对人说:“做生意最重要的就是和气生财。”他的商铺,本在美团上订单销
期刊
现代人因工作和生活等原因,十个有九個有肩周血液循环不畅,肌肉酸痛几乎成了大家的标配。比如师妹,偶尔锻炼一下身体,第二天起来那滋味叫一个酸爽。听说德国匠心老牌Almisan艾美森有款去痛香膏,常年颈椎不适的师妹也跟风入手试了试,简直太管用了!  德国56年匠心品牌  德国艾森(ASAM)公司成立于1963年,是德国知名草本药妆制造商,距今已有56年历史,说是德国家喻户晓的品牌也不为过。而Almisa
期刊