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;
}

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值