C++继承派生类实验题

it2023-01-13  53

这题我可真是做了好久好久,最大的感叹就是现在会的功能还太有限了,一起来看看吧! 题目如下: 显示小孩的出生时间和姓名 (10分) 已有类Time和Date,要求设计一个派生类Birthtime,它继承类Time和Date,并且增加一个数据成员Childname,用于表示小孩的名字,同时设计主程序,输入2个小孩的姓名、出生日期,并将这两个小孩的姓名、出生日期输出。

class Time { public: Time(int h,int m,int s) { hours=h; minutes=m; seconds=s; } void display() { cout<<hours<<":"<<minutes<<":"<<seconds; } protected: int hours,minutes,seconds; }; class Date { public: Date(int m,int d,int y) { month=m; day=d; year=y; } virtual void display() { cout<<year<<"-"<<month<<"-"<<day; } protected: int month,day,year; };

输入格式: 一共两行,每行为一个孩子的信息。该行分别为:姓名、年、月、日、小时、分钟、秒

输出格式: 小孩的姓名:出生年月,出生时间

输入样例: 在这里给出一组输入。例如:

Mary 2020 1 1 23 12 30 Michael 2019 1 21 14 5 56 输出样例: 在这里给出相应的输出。例如:

Mary: 2020-1-1 23:12:30 Michael: 2019-1-21 14:5:56

先上一下具体代码,之后逐条分析:

#include <iostream> #include <string> using namespace std; class Time { public: Time(int h,int m,int s) { hours=h; minutes=m; seconds=s; } void display() { cout<<hours<<":"<<minutes<<":"<<seconds; } protected: int hours,minutes,seconds; }; class Date { public: Date(int m,int d,int y) { month=m; day=d; year=y; } virtual void display() { cout<<year<<"-"<<month<<"-"<<day; } protected: int month,day,year; }; class Birthtime:public Time,public Date { private: string name; public: Birthtime(string na="a",int n=0,int d=0,int y=0,int h=0,int m=0,int s=0):Date(n,d,y),Time(h,m,s) { name=na; } void setBirthtime(string na,int n,int d,int y,int h,int m,int s) { name=na; year=n; month=d; day=y; hours=h; minutes=m; seconds=s; } void print() { cout<<name<<": "; Date::display(); cout<<" "; Time::display(); cout<<endl; } }; int main() { Birthtime kid1,kid2; string name1,name2; int y1,y2,y3,x1,x2,x3; int p1,p2,p3,q1,q2,q3; cin>>name1>>y1>>y2>>y3>>x1>>x2>>x3; cin>>name2>>p1>>p2>>p3>>q1>>q2>>q3; kid1.setBirthtime(name1,y1,y2,y3,x1,x2,x3); kid2.setBirthtime(name2,p1,p2,p3,q1,q2,q3); kid1.print(); kid2.print(); return 0; }

1、建立派生类Birthtime

#include <iostream> #include <string>//既然C++中对string类有扩展,这里就尝试用一下啦,是真的好用,不用为C语言里的字符数组头秃了 using namespace std; class Time { public: Time(int h,int m,int s) { hours=h; minutes=m; seconds=s; } void display() { cout<<hours<<":"<<minutes<<":"<<seconds; } protected: int hours,minutes,seconds; }; class Date { public: Date(int m,int d,int y) { month=m; day=d; year=y; } virtual void display() { cout<<year<<"-"<<month<<"-"<<day; } protected: int month,day,year; };//直接把题目里给的两个父类粘过来 class Birthtime:public Time,public Date//定义派生类Birthtime,公有继承两个父类:Time以及Date { private: string name;//唯一的新增成员string类name public: Birthtime(string na="a",int n=0,int d=0,int y=0,int h=0,int m=0,int s=0):Date(n,d,y),Time(h,m,s) { name=na; }//定义构造函数,一要注意这里的初始化列表格式,二要注意这里都要有默认的值,至于原因请看后面 void setBirthtime(string na,int n,int d,int y,int h,int m,int s) { name=na; year=n; month=d; day=y; hours=h; minutes=m; seconds=s; }//至于为什么定义了构造函数,还要定义一个setBirthtime,是因为流的重载还没学到,所以在主函数里不会怎样直接给构造函数输入的语句,就只能靠setBirthtime函数了 void print() { cout<<name<<": "; Date::display();//调用父类函数,前面加Date::限定,是为了避免二义性 cout<<" "; Time::display();//同上 cout<<endl; }//注意要求的输出格式 };

2、主函数部分

int main() { Birthtime kid1,kid2;//先定义两个对象,题目中已经明确给出了就是输入两个孩子的信息,所以没有使用数组,但我一开始的版本是建立的对象数组,不知道为什么每次无法输入... string name1,name2; int y1,y2,y3,x1,x2,x3; int p1,p2,p3,q1,q2,q3;//这里吧,就还是回到我最一开始说的,觉得自己会的太少了,就只能用这种笨方法。在主函数中定义一堆的数据 cin>>name1>>y1>>y2>>y3>>x1>>x2>>x3; cin>>name2>>p1>>p2>>p3>>q1>>q2>>q3;//然后一个个输入这些数据 kid1.setBirthtime(name1,y1,y2,y3,x1,x2,x3); kid2.setBirthtime(name2,p1,p2,p3,q1,q2,q3);//再通过setBirthtime函数,用上述数据给对象初始化,看出来有多麻烦了吧...我决定学完第五章之后专门写一篇来高度赞扬一下运算符重载!! kid1.print(); kid2.print();//最后在调用输出的函数 return 0; }

3.为什么要对构造函数初始化? 加入在派生类的构造函数里我这样写:

Birthtime(string na,int n,int d,int y,int h,int m,int s):Date(n,d,y),Time(h,m,s) { name=na; }

就会给这样的报错: error C2512: ‘Birthtime’ : no appropriate default constructor available 回到主函数

int main() { Birthtime kid1,kid2; string name1,name2; int y1,y2,y3,x1,x2,x3; int p1,p2,p3,q1,q2,q3; cin>>name1>>y1>>y2>>y3>>x1>>x2>>x3; cin>>name2>>p1>>p2>>p3>>q1>>q2>>q3; kid1.setBirthtime(name1,y1,y2,y3,x1,x2,x3); kid2.setBirthtime(name2,p1,p2,p3,q1,q2,q3); kid1.print(); kid2.print(); return 0; }

注意看这里第一行我只是建立了两个对象,但是立马赋初值了吗?没有!但是我在创建类的时候自己定义了构造函数,所以系统默认的那个,函数体为空,参数表为空的构造函数就没有了,那么这个默认的构造函数有什么用呢?给对象开辟存储空间。可现在它被覆盖了,而你在创建对象的时候又没有给初始化,所以就会出错。解决方法有二,第一种就是我的代码里这样,在构造函数中给出默认值,所以在主函数中构建对象的时各数据直接就是默认值;第二种就是在类中重载一个构造函数,用于开辟存储空间。 继续加油!

最新回复(0)