本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系将于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;
}