4.2 面向对象程序设计-类的继承实验

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系将于24小时内删除

目录

1.实验内容

2.实验原理

2.1类的继承

2.2 继承的优点和缺点

2.3 继承的方式

3.实验代码

1.实验内容

       创建一个父类CalcTime,在父类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于指定小时值、分钟值的常量TIME_VAL_HOUR和TIME_VAL_MIN;用于计算小时值和分钟值,同时获取对应值后向外输出的GetTimeVal()函数。然后定义一个继承父类的CalcAllTime子类,在子类中定义用于计算秒值,同时获取对应值向外输出的GetSecVal()函数;用于判断tick是否符合条件的CalcFlg()函数;用于打印转换结果的DispTime()函数。在main()函数中创建一个CalcAllTime型对象,该对象名为ct,然后获取键盘输入值(0~86399之间的值,包括0和86399),实现秒值-时间值转换,并输出转换结果。

2.实验原理

2.1类的继承

       继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类。继承是类与类之间的关系,使用继承可以减少代码的冗余。

       例如,现在有两个问题,第一个是使用看门犬解决看家问题,第二个是使用牧羊犬解决放牧问题。由于看门犬和牧羊犬都属于犬类,具有与犬类相同的属性和行为,例如性别和身长属性,以及行走和奔跑行为,这样就可以先定义一个犬类。然后,在使用看门犬解决看家问题时,就可以创建一个继承犬类的看门犬类,并且在看门犬类中新增看门行为的定义;在使用牧羊犬解决放牧问题时,就可以创建一个继承犬类的牧羊犬类,并且在牧羊犬类中新增牧羊行为的定义,如下图所示。这样,就节省了定义犬类与看门狗、牧羊犬共同具有的属性和行为的时间,这就是继承的基本思想。

2.2 继承的优点和缺点

        如果不使用继承的思想,分别定义看门犬类和牧羊犬类,代码就会出现重复,这样不仅会导致代码臃肿,而且在后期维护中,如果重复性的地方出错,就需要修改大量的代码,使得系统维护性低。而使用继承的思想,以上问题都可以解决,因此,继承的优点有:

①代码冗余度低,开发时间短;

②代码扩展性高,系统开发灵活性强;

③代码重用性高,系统出错概率低。

除了优点,继承也有相应的缺点:

①继承是侵入性的,只要继承,就必须拥有父类的所有属性和方法;

②子类拥有父类的属性和方法,增加了子类代码的约束,降低了代码的灵活性;

③当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来大段代码需要重构的后果,增强了代码的耦合性。

2.3 继承的方式

       类的继承是单一继承的,即一个子类只能拥有一个父类,子类除了可以扩展父类的功能,还可以重写父类的成员方法。

       类有3种继承方式:公有继承(public)、私有继承(private)和保护继承(protected)。

       公有继承可以理解为父类的public成员和protected成员分别写到子类的public和protected成员中,而父类的private被分到了一个特殊的区域里面,该区域只能用父类原有的方法来访问。

       私有继承可以理解为父类的public成员和protected成员写到子类的private成员中,而父类的private被分到了一个特殊的区域里面,该区域只能用父类原有的方法来访问。

       保护继承可以理解为父类的public成员和protected成员写到子类的protected成员中,而父类的private被分到了一个特殊的区域里面,该区域只能用父类原有的方法来访问。

3.实验代码

#include <iostream>
using namespace std;//基类
class CalcTime
{private:int mHour;  //小时值int mMin;   //分钟值public:int mSec;   //秒值static const int TIME_VAL_HOUR = 0x01;static const int TIME_VAL_MIN  = 0x02;//外部接口,输出转换的时间值int GetTimeVal(int type,int tick) {int timeVal = 0;//tick对3600取模赋值给mHourmHour = tick / 3600;        //tick对3600取余后再对60取模赋值给mMinmMin  = (tick % 3600) / 60;switch(type){case TIME_VAL_HOUR:timeVal = mHour;break;case TIME_VAL_MIN:timeVal = mMin;break;default:break;}return timeVal;}
};//类CalcAllTime通过公有继承方式继承基类CalcTime
class CalcAllTime: public CalcTime
{public://外部接口,输出转换的秒值int GetSecVal(int tick){int timeSec = 0;//tick对3600取余后再对60取余赋值给mSecmSec  = (tick % 3600) % 60; timeSec = mSec;return timeSec;}int CalcFlg(int tick) {int validFlag = 0;  //判断tick是否符合条件的标志位if(tick >= 0 && tick <= 86399) {validFlag = 1;  //符合则返回1,然后转换时间     			}return validFlag;}//获取转换的时间并打印显示void DispTime(int tick) {int hour; //小时值int min;  //分钟值int sec;  //秒值  //当tick的值在0~86399之间时,获取转换的时间值if(CalcFlg(tick) == 1) {           hour = GetTimeVal(TIME_VAL_HOUR,tick);min  = GetTimeVal(TIME_VAL_MIN,tick);sec  = GetSecVal(tick);//打印转换之后的时间结果cout << "Current time : " << hour << "-" << min << "-" << sec << endl;}}
};int main()
{CalcAllTime ct;int tick = 0;   //0~86399    cout << "Please input a tick between 0~86399" << endl;cin  >> tick; ct.DispTime(tick);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10 Php学习:循环

在 PHP 中&#xff0c;提供了下列循环语句&#xff1a; while - 只要指定的条件成立&#xff0c;则循环执行代码块do…while - 首先执行一次代码块&#xff0c;然后在指定的条件成立时重复这个循环for - 循环执行代码块指定的次数foreach - 根据数组中每个元素来循环代码块 当…

Python八股文:基础知识Part2

1. Python中变量的保存和访问 Python中的变量实际上是一个指向对象的引用&#xff0c;每个对象都有一个唯一的标识符&#xff08;即内存地址&#xff09;。对于一些不可变对象&#xff0c;如字符串和整数&#xff0c;因为它们的值不可更改&#xff0c;所以当多个变量引用相同的…

React Hooks 全解: 常用 Hooks 及使用场景详解

React Hooks 是 React 16.8 版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。 React 中常用的 10 个 Hooks,包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect、useImperativeHandle 和 useDebugValue。这些…

分享一下项目中遇到的排序失效问题

今天把原来的一个查询接口的业务代码进行了优化&#xff0c;减少了十几行冗余的代码。 原来的代码 ChongwuServiceImpl.java /*** author heyunlin* version 1.0*/ Slf4j Service public class ChongwuServiceImpl implements ChongwuService {Overridepublic JsonResult<…

中介者模式:简化对象间通信的协调者

在面向对象的软件开发中&#xff0c;中介者模式是一种重要的行为型设计模式&#xff0c;用于降低多个对象间通信的复杂性。通过提供一个中心化的对象来处理不同组件之间的交互&#xff0c;中介者模式使得组件间不必显式引用彼此&#xff0c;从而使其松散耦合、更易于维护。本文…

数据库系统概论(超详解!!!)第四节 数据库安全性

问题的提出&#xff1a; 数据库的一大特点是数据可以共享 数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享。 1.数据库的安全概述 数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏 。 系统安全保护措施是否有效…

【电控笔记6】电流回路+延迟效应

问题提出 数字控制系统的delay: 5.4节有介绍T0=0.5TS 低通滤波器的时间常数? 可用示例程序 m2 2 1b 如下图画出开环系统的伯德图进行比较,如图 2-2-4 所示,由于延迟组件会侵蚀系统的相位,因此从图可以看出,加入延迟效应后,q轴电流回路的相位裕度(Phase Margin) 从…

【python】python饮料销售数据分析可视化(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

7/8电源连接器航空插头端子

概述 7/8电源连接器是一种工业电源连接器的规格型号之一&#xff0c;常见于工业领域的电力传输和连接应用。它的名称中的“7/8”代表连接器插头的直径尺寸&#xff0c;通常为7/8英寸。这种类型的连接器通常用于较大电流传输和较高功率设备的连接&#xff0c;具有较大的电流承载…

JS控制元素平滑滚动,页面自动滚动锚点实现

使用 scrollIntoView 实现元素内子元素的平滑滚动&#xff0c; 下面是模拟接口list返回&#xff0c;然后通过按钮切换下一个&#xff0c;页面就会滚动到响应的位置 具体 scrollIntoView 有一些其他参数来配置滚动的具体交换&#xff0c;网上去查即可 备注&#xff1a;下面的代码…

实时智能应答3D数字人搭建2

先看效果&#xff1a; 3d数字人讲黑洞 根据艾媒咨询数据&#xff0c;2021年&#xff0c;中国虚拟人核心产业规模达到62.2亿元&#xff0c;带动市场规模达到1074.9亿元&#xff1b;2025年&#xff0c;这一数据预计将达到480.6亿元与6402.7亿元&#xff0c;同比增长迅猛。数字人可…

什么是线程的上下文切换?

我们知道使用多线程的目的是为了充分利用多核CPU&#xff0c;比如说我们是16核&#xff0c;但是当创建很多线程比如说160个&#xff0c;CPU不够用了&#xff0c;此时就是一个CPU来应付多个线程&#xff08;这里我们是一个CPU应对10个线程&#xff09;。这个时候&#xff0c;操作…