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取模赋值给mHour
            mHour = tick / 3600;        
				
			//tick对3600取余后再对60取模赋值给mMin
            mMin  = (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取余赋值给mSec
            mSec  = (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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对装饰器模式的理解

目录 一、场景二、面对场景中的新需求&#xff0c;我们怎么办&#xff1f;1、暴力法&#xff1a;直接修改原有的代码。2、子类继承法&#xff1a;既然要增强行为&#xff0c;那我搞一个子类&#xff0c;覆写不就完事了&#xff1f;3、装饰器模式 三、对装饰器模式的思考1、从代…

C语言-----结构体详解

前面已经向大家介绍过一点结构体的知识了&#xff0c;这次我们再来深度了解一下结构体。结构体是能够方便表示一个物体具有多种属性的一种结构。物体的属性可以转换为结构体中的变量。 1.结构体类型的声明 1.1 结构体的声明 struct tag {member-list;//结构体成员变量 }vari…

Shopee(虾皮)有哪些站点?

虾皮&#xff08;Shopee&#xff09;是东南亚地区的跨境平台&#xff0c;目前拥有多个站点&#xff0c;以下是对虾皮各站点的简要介绍&#xff1a; 中国台湾站&#xff1a;作为大多数新卖家的默认首站&#xff0c;台湾站没有语言障碍&#xff0c;运营起来更为方便&#xff0c;…

Java 中文官方教程 2022 版(一)

原文&#xff1a;docs.oracle.com/javase/tutorial/reallybigindex.html 教程&#xff1a;入门指南 原文&#xff1a;docs.oracle.com/javase/tutorial/getStarted/index.html 这个教程提供了关于开始使用 Java 编程语言的所有必要信息。 提供了 Java 技术作为一个整体的概述。…

android gradle版本无法下载

android gradle版本无法下载问题解决方法 在引入一个新的android项目的时候&#xff0c;通常会因为无法下载gradle版本而一直卡在同步界面&#xff0c;类似于下面的情况。 这是因为gradle运行时首先会检查distributionUrlhttps://services.gradle.org/distributions/gradle-5.6…

Springboot+Vue项目-基于Java+MySQL的社区团购系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【linux篇】ubuntu安装教程

有道是工欲善其事必先利其器&#xff0c;在学习linux前&#xff0c;先得搭建好环境才能事半功倍。 1.VMware虚拟机安装 打开浏览器&#xff0c;可直接在搜索栏中输入VMware。

ControllerAdvice用法

ControllerAdvice用法 ControllerAdvice是一个组件注解&#xff0c;它允许你在一个地方处理整个应用程序控制器的异常、绑定数据和预处理请求。这意味着你不需要在每个控制器中重复相同的异常处理代码&#xff0c;从而使得代码更加简洁、易于管理。 主要特性 全局异常处理&a…

AI绘梦师新项目歪门邪道2.0游戏玩法,仅需拷贝,一键生成,单日盈利500

我们今天要介绍的项目是“AI绘梦师新项目歪门邪道2.0游戏玩法”。这个项目的核心是利用AI技术帮助企业将用户的梦境转化为美术作品。操作起来非常简单&#xff0c;只需复制用户描述的梦境内容&#xff0c;然后将其输入到AI绘画软件中&#xff0c;软件就能自动生成相应的画作。 …

mysql索引与优化问题

作为一个java程序员&#xff0c;mysql数据库面试应该是比较多的了&#xff1b;而关于数据库的面试&#xff0c;最多的就是性能问题&#xff0c;而以性能为起点&#xff0c;延伸出很多具体的问题。 我们使用第一性原理的方法来分析&#xff0c;为什么面试中一定会问数据库的索引…

俄罗斯人遇到智障都怎么表达,柯桥成人俄语学习日常口语教学

你知道俄罗斯人 口吐芬芳 表达友好时怎样称呼他人吗&#xff1f; “兔崽子”“蠢货”“白痴”......你知道这些词用俄语都怎样说吗&#xff1f; 事先声明&#xff1a;本期不正经科普仅供娱乐&#xff0c;实操之后挨打了不要怪小编哦~ 1、тетеря 笨蛋 <转, 俗, 谑&g…

dfs板子

递归实现排列 留着明早省赛之前看 #include<iostream> using namespace std; int arr[10010]; int brr[10010]; int n,k; void dfs(int num){if(num > n){for(int i 1;i < n;i){cout << arr[i] << " ";}cout << endl;return;}for(in…

210. 课程表 II

题目重现: 方法一: 根据拓扑排序的人工模拟推导的算法 基本思想就是统计每个节点的入度 入度为0进入队列 在循环中每次 从队列中移出一个元素 并把它指向的元素入度减一 同样的入度为0进入队列 当队列为空 或者 次数达到numCourse 退出循环 class Solution { public:v…

为数据穿上安全的外衣——零售电商场景下的数据安全体系建设

在电子商务交易过程中&#xff0c;会涉及大量的个人和财务数据的传输和处理&#xff0c;随着电子商务的发展&#xff0c;数据安全风险也成为一个备受关注的问题。 而跨境电商&#xff0c;属于出海业务&#xff0c;涉及到海外不同国家的政策法规&#xff0c;且数据作为电商的业…

【Tars-go】腾讯微服务框架学习使用03-- TarsUp协议

3 TarsUP协议 统一通信协议 TarsTup | TarsDocs (tarscloud.github.io) TarsDocs/base at master TarsCloud/TarsDocs (github.com) &#xff1a; 有关于tars的所有介绍 每一个rpc调用双方都约定一套数据序列化协议&#xff0c;gprc用的是protobuff&#xff0c;tarsgo是统一…

免费升级至HTTPS协议教程

一、前言 HTTPS协议以其安全性和数据加密特性&#xff0c;逐渐取代HTTP成为互联网通信的主流协议。本文将为您简洁明了地介绍如何免费升级至HTTPS协议。 二、获取免费SSL证书 选择证书提供商&#xff1a;如JoySSL等提供免费SSL证书的服务。 免费申请地址https://www.joyssl.…

Elastic 线下 Meetup 将于 2024 年 4 月 27 号在重庆举办

2024 Elastic Meetup 重庆站活动&#xff0c;由 Elastic、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 活动时间 2024年4月27日 13:30-18:00 活动地点 中国重庆 沙坪坝区学城大道62-1号研发楼一期b3栋1楼(瑞幸咖啡旁&#xff09; 活动流程 14:00-14:50…

Ubuntu 22.04安装新硬盘并启动时自动挂载

方法一 要在Ubuntu 22.04系统中安装一个新硬盘、对其进行格式化并实现启动时自动挂载&#xff0c;需要按以下步骤操作&#xff1a; 1. 安装硬盘 - 确保你的硬盘正确连接到计算机上&#xff08;涉及硬件安装&#xff09;。 2. 发现新硬盘 - 在系统启动后&#xff0c;打开终端…

【InternLM 实战营第二期-笔记4】XTuner 微调个人小助手认知

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营&#xff0c;我也将会通过笔记博客的方式记录学习的过程与遇到的问题&#xff0c;并为代码添加注释&#xff0c;希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) XTuner 微调个人小助手…

OSCP靶场--Fail

OSCP靶场–Fail 考点(rsync未授权覆盖公钥Fail2ban提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.126 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-12 23:34 EDT Warning: 192.168.153.126 giving …