C++学习笔记----4、用C++进行程序设计(三)---- 类间关系

news2024/11/29 2:42:47

        作为一名程序员,会不可避免地碰到不同的类具有相同的特点,或者看起来相互之间有一定的关系。面向对象的编程语言提供许多技术来处理类间的这种关系。比较令人迷惑的部分就是理解 这些关系到底是什么?有两种主要的类间关系--复合关系(has-a)与继承关系(is-a)。

1、复合关系(has-a)

        具有复合关系(has-a)的类就是模式A拥有B,或者是A包含B。在这种关系中,你可以认为一个类是另一个类的一部分。就是我们前面定义的部件,一般来说,就是一个复合(has-a)关系,因为它描述的类都是由其他类组成的。

        现实世界中的这种关系的例子比如动物园与猴子。你可以说动物园里有猴子或者动物园中包含了猴子。在代码中模拟动物园就是一个有猴子部件的动物园类。

        通常情况下,考虑一下用户接口的场景对理解类之间的关系很有帮助。因为即使不是所有的用户接口都使用了OOP(但现如今,大部分都是),屏幕上的可视化的元素都转化成了类。一个对于复合关系的UI类比就是窗口包含一个按钮。按钮和窗口很明显是两种单独的类,但是它们很明显在某种程度上相关。因为按钮在窗口中,你可以说窗口中有一个按钮。

        下图展示了真实世界中用户接口的复合关系。

        复合关系有两种:

  • 聚合关系:对于聚合关系,聚合对象(部件)在聚合器被破坏的情况下仍可生存。例如一个动物园对象包含有许多动物对象。当动物园对象因为破产被破坏了,动物对象理想情况下不会被破坏,因为他们可以转移到其他动物园。
  • 组合关系:对于组合关系,如果组合了其他对象的对象被破坏了,那些其他对象也就被破坏了。比如一个包含了按钮的窗口对象被破坏了,按钮对象也就被破坏了

        上述关系还可以用一个更简单易懂的例子来说明,前苏联是由许多加盟共和国组成,前苏联与加盟共和国的关系就是组合关系,前苏联解体了,各加盟共和国纷纷独立,也就不存在了。而存在过的一段时间的独联体与各加盟共和国之间的关系就是聚合关系,短暂的独联体消失了,对各加盟共和国几乎没有什么影响,各加盟共和国还依然存在。

2、继承关系(is-a)

        继承关系(is-a)在面向对象编程中是一个非常基础的概念,除了继承这个命名之外,还有像派生关系,子类关系,扩展关系等等。类将现实世界中包含了具有属性与行为的对象模型化。继承关系模型化了那些以层次结构进行组织的对象。这种层次结构展示了继承关系。

        从最基础的讲起,继承就是模式A是B或A非常像B--是不是有点懵逼。还是前面说的那个动物园的简单的例子,但是呢,假设除了猴子还有其他动物。这句话本身就构造了这种关系--猴子是动物。同样的,长颈鹿是动物,袋鼠是动物,企鹅是动物。然后呢?好吧,继承的魔法就来自于你意识到猴子、长颈鹿、袋鼠和企鹅有共同的东东。这些共同性就是动物的共通的特点。

        对于程序员来说就意味着可以定义一个Animal类来包装所有这些适用于每一种动物的属性(大小、位置、饲料等等)以及行为(移动、吃、睡觉)。某种动物,比如猴子,就成为了Animal的具有动物的所有特点的派生类。记住,猴子是一种加上了具有另外使其与众不同的特点的动物。下图展示了动物的继承关系。箭头显示了继承的方向。

        就像猴子与长颈鹿是不同类型的动物一样,用户接口也有不同的按钮。例如,选择框也是一个按钮。假定一个按钮只是一个简单的UI元素,可以单击执行一个动作,选择框扩展了按钮类,增加了状态--勾选与未勾选。

        当分析继承关系的类关联时,目标就是将共同功能全部放入基类中,其他类由基类扩展。如果你发现派生类具有类似或者就是一样的代码,考虑要把其中一些或者全部代码移到基类中。这样的话,所有需要对基类的修改只需要改一次,以后派生类就可以“免费”获得这些共享的功能了。

        有时候,类之间是复合关系还是继承关系是很清晰的,但也有时候不是那么清晰。如果必须选择的话,还是要先用复合关系,我们以后慢慢讲吧。

2.1、继承技巧

        前面的例子只是点到了一些用于继承的技巧,但没有详细讲述。对类进行派生时,程序员有几种方式可以将一个类与它的父类,也可以叫做基类或超类进行区分。派生类可以使用一种或多种技巧,通过完成“A是B,B怎么样...”的句子就可以达到。

2.1.1、增加功能

        派生类可以通过增加另外的功能来扩大父类。例如,猴子是一种可以在树上爬来爬去的动物。除了Animal的成员函数外,猴子类也有一个swingFromTrees()的成员函数,并且它只对猴子类有效。

2.1.2、替换功能

        派生类可以完全替换或者覆盖父类的一个成员函数。例如,大部分动物通过走路进行移动,所以你可能给Animal类一个move()的成员函数来模拟走路。如果是这样的话,袋鼠就不是通过走路而是通过跳来进行移动的动物。而Animal基类其他的属性和成员函数依然有效,但袋鼠派生类只是改变了move()成员函数走路的方式。当然了,如果你发现替换了基类的所有的功能,那就意味着继承可能就不是一个正确的选择了,除非基类是一个抽象基础类。抽象基础类强制每一个派生类去实现在抽象基础类中没有实现的所有成员函数。不能创建抽象基础类的实例。

2.1.3、增加属性

        派生类也可以增加继承于基类的新的属性。例如,企鹅除了具有动物的所有属性外,还可以有一个喙的长度的属性。

2.1.4、替换属性

        C++提供了类似于覆盖成员函数的方式来对属性进行覆盖。然而,这么做基本上不合适,因为它隐藏了基础类的属性;也就是说,基础类对于特定名字的属性有了一个特别的值,而派生类可以对另一个具有同样名字的属性有了一个另外的值。说白了,就是你楞是要给手机的颜色属性赋一个江苏的值,你就说你迷糊不迷糊吧?

2.2、多态

        多态是指对象符合可以替换的标准属性集与成员函数的符号表示。类的定义就像类和与其交互的代码之间的合同。根据定义,猴子对象一定要支持猴子类的属性与成员函数。

        这个符号扩展到了基础类。因为猴子是动物,所以猴子对象也支持动物类的属性与成员函数。

        多态是面向对象编程中一个很美的部分,因为它真正地获得了继承提供的优势。在动物园的类比中,你可以编程去循环动物园中的所有动物,让每个动物移动一次。因为所有的动物都是动物类的成员,他们都知道怎么去移动。有些动物覆盖了移动的成员函数,但这就是最棒的部分----代码只是告诉动物去移动而不用知道也不关心它是什么类型的动物。每个动物只有自己知道怎么去移动。

        可能有的同学在看最近的博文的时候可能会提一个问题,怎么没有代码了。这个问题算是提到点儿上了。我们是要学C++的精髓,而不是C++的语法。在漫长的C++的学习过程中,工欲善其事必先利其器。而这个器在我的笔记中,更多的是从根儿上要彻底地掌握C++的精髓。C++我也用了好多年,也学了好多遍,从内心讲,觉得还是没有掌握,为什么呢,就是因为以前的学习和使用太过于关注那些表面的东东,那些细节的语法。而在最根本的OOP方面,却反而没有掌握到家。成大事者,除了孟子的那些苦其心志、劳其筋骨之类的鸡汤之外,我觉得掌握核心的东西才是本心。我们要在最基本的OOP的思想上面花费一些功夫,也算是磨刀不误砍柴工吧,愿你我在C++的学习之路上共同奋斗,以此共勉!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【三维语义分割模型】PAConv

【版权声明】本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。 参考书籍:《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章,专栏介绍地址“【python三维深度学习】python…

780nm扫地机器人模组出现质量问题怎么检测?

随着智能家居的普及,扫地机器人已成为现代家庭不可或缺的清洁助手。其中,780nm扫地机器人模组作为扫地机器人的核心部件之一,其质量和性能直接影响到扫地机器人的整体表现。然而,在使用过程中,有时会遇到模组出现质量问…

无线领夹麦克风怎么挑选?选购领夹麦克风必看的五大智商税!

在数字音频技术飞速发展的今天,无线领夹麦克风已经不再是遥不可及的奢侈设备,而逐渐成为普通人记录生活、录制音视频、乃至直播互动的得力助手。但如今市面上的麦克风多到让眼眼花缭乱,对于一些没有经验的新手小伙伴,更是不知从何…

以简单的例子从头开始建spring boot web多模块项目(二)-mybatis简单集成

继续使用以简单的例子从头开始建spring boot web多模块项目&#xff08;一&#xff09;中的项目进行mybatis集成。 1、pom.xml文件中&#xff0c;增加相关的依赖包的引入&#xff0c;分别是mybatis-spring-boot-starter、lombok、mysql-connector-java 如下&#xff1a; <d…

python实用教程(二):安装配置Pycharm及使用(Win10)

上一篇&#xff1a;python实用教程&#xff08;一&#xff09;&#xff1a;安装配置anaconda&#xff08;Win10&#xff09;-CSDN博客 1、简介及下载 PyCharm是一款功能强大的 Python 编辑器&#xff0c;具有跨平台性。是Jetbrains家族中的一个明星产品。 下载地址&#xff…

Nacos漏洞检测总结

弱口令 默认账号密码 nacos/nacos POST /nacos/v1/auth/users/login HTTP/1.1 Host: xxxx:8848 Connection: keep-alive Content-Length: 29 Accept: application/json, text/plain, */* User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like…

高效分页策略:掌握 LIMIT 语句的正确使用方法与最佳实践

本文主要介绍limit 分页的弊端及线上应该怎么用 LIMIT M,N 平时经常见到使用 <limit m,n> 合适的 order by 来实现分页查询&#xff0c;这样做到底性能如何呢&#xff1f; 先来简单分析下&#xff0c;然后再实际验证一下。 无索引条件下&#xff0c;需要做大量的文件排…

代码随想录 刷题记录-13 回溯(2)组合问题

在这里涉及到的回溯中的抽象树&#xff0c;都是“选哪一个元素”的思想。 1.第77题. 组合 回溯法就用递归来解决嵌套层数的问题。 把组合问题抽象为如下树形结构&#xff1a; 可以看出这棵树&#xff0c;一开始集合是 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c; …

探索Python交互式编程的新境界:Python-prompt-toolkit的魔法

文章目录 探索Python交互式编程的新境界&#xff1a;Python-prompt-toolkit的魔法背景&#xff1a;为何选择Python-prompt-toolkit&#xff1f;Python-prompt-toolkit是什么&#xff1f;如何安装Python-prompt-toolkit&#xff1f;简单使用&#xff1a;Python-prompt-toolkit的…

MongoDB Compass初体验

入坑Mongodb也好多年了&#xff0c;客户端一直都是使用的Robomongo&#xff0c;后改名为Robo 3T了&#xff0c;现在又改名为Studio 3T&#xff0c;还分了免费版和付费版。 最近换了新电脑&#xff0c;需要重新安装Mongodb的客户端&#xff0c;加上公司对安装软件的各种限制&…

国内首颗ASIL D级高端旗舰级R52+内核车规MCU发布,中国汽车芯片强势崛起

8月21日&#xff0c;在2024紫光同芯合作伙伴大会上&#xff0c;紫光同芯正式发布第二代THA6系列高端旗舰级新品THA6412。该芯片在安全性、可靠性、算力、实时性等方面全方位升级&#xff0c;是继今年7月紫光同芯发布THA6206芯片后&#xff0c;又一款通过ASIL D产品认证的旗舰级…

GDB的基本使用(1)

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…

小白快速上手 SRC漏洞挖掘科普攻略!零基础入门到精通,收藏这一篇就够了

前言 随着网络安全的快速发展&#xff0c;黑客攻击的手段也越来越多样化&#xff0c;因此SRC漏洞挖掘作为一种新的网络安全技术&#xff0c;也在不断发展和完善。那么&#xff0c;作为一个网安小白如果想要入门SRC漏洞挖掘&#xff0c;需要掌握哪些知识呢&#xff1f;以下是本…

css属性 clip-path切割多边形polygon

如果我们要把一个矩形切割成如图所示&#xff0c;可以使用 clip-path来做切割 clip-path&#xff1a;polygon&#xff08;x1 y1&#xff0c;x2 y2&#xff09;里面的参数是切割后每个顶点的坐标&#xff0c;坐标的原点是div的左上角&#xff0c;每个顶点的坐标如下&#xff1a…

海山数据库(He3DB)源码详解:事务源码执行过程

海山数据库(He3DB)源码详解&#xff1a;事务源码执行过程 本文介绍了He3DB数据库在DDL和DML操作过程中&#xff0c;两种事务在底层源码执行流程细节。 操作过程 1、启动数据库并进入GDB 首先&#xff0c;在终端A启动一个测试用的数据库test&#xff0c;并查看当前测试用的t…

【Qt】输入类控件QLineEdit

目录 输入类控件QLineEdit 例子&#xff1a;录入个人信息 例子&#xff1a;使用正则表达式验证输入框的数据 例子&#xff1a;验证俩次输入密码一致 例子&#xff1a;切换显示代码 输入类控件QLineEdit QLineEdit 用来表示单行输入框&#xff0c;可以输入一段文本&#xf…

ubuntu18.04更改系统语言及换源的方法步骤

ubuntu的虚拟机不知道第几次被玩崩溃了&#xff0c;无奈只好重装&#xff0c;这里记录下更改语言和换源的操作步骤。 一、更改系统语言为简体中文 1&#xff0c;点击虚拟机右上角的开始按钮&#xff0c;选择设置。 2&#xff0c;在左侧选项中选择Region & Language,再选择…

day28-测试自动化之Requests库的发送请求、响应内容、Cookie和session

目录 一、发送请求 1.1.GET请求 1).作用 2).步骤 3).响应对象 4).代码 5).带参代码 1.2.POST请求 1).作用 2).应用 3).参数 4).代码&#xff08;地址已失效&#xff09; 5).扩展 1.3.PUT请求 1).作用 2).应用 3).参数 4).响应 5).代码&#xff08;地址已失效&#xff09; 1.4.D…

DC-2综合渗透,rbash逃逸,git提权,wordpress靶场渗透教程

前言 博客主页&#xff1a;【h0ck1r丶羽】的公众号~~ ​ 本文主要讲解了渗透测试中的完整渗透测试流程&#xff0c;主要介绍了【wpscan】、【cewl】、【rbash逃逸】的使用技巧&#xff0c;靶场为vulnhub的机器大家可以自行下载&#xff0c;如果文章哪有不对&#xff0c;还请师…

大模型在应用开发安全左移实践

1.应用开发安全左移势在必行 近年来&#xff0c;应用系统被入侵或敏感信息泄漏类的安全事件时有发生&#xff0c;大部分安全事件的根本原因是应用软件设计或实现中存在安全漏洞。由于软件安全性问题导致各种信息泄密、信息被篡改、网络服务中断的事件频发&#xff0c;给企业和…