1.问题描述
共有以下 4小点 的类继承、派生关系:
(1)从people(人员)类派生出student(学生)类,添加属性:班号char classNo[7];
(2)从people类派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
(3)从student类派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;
(4)从graduate类和teacher类派出TA(助教生)类,重载相应的成员函数,测试这些类。
People的(人员)类内容为 :number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等,其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。
2.代码实现
#include<iostream>
#include<string.h>
using namespace std;
//日期类
class Date{
public:
//无参构造函数
Date(){}
//有参构造函数
Date(int year,int month,int day){
this->year=year;
this->month=month;
this->day=day;
}
//录入信息
void InDateInformation(int year,int month,int day){
this->year=year;
this->month=month;
this->day=day;
}
//显示信息
void OutDateInformation(){
cout<<"出生日期:"<<year<<"-"<<month<<"-"<<day<<endl;
}
private:
int year;//年
int month;//月
int day;//日
};
//People
class People{
public:
//无参构造函数
People(){}
//有参构造函数
People(char *name,char *number,char sex,int year,int month,int day,char *id):birthday(year,month,day){
strcpy(this->name,name);
strcpy(this->number,number);
this->sex=sex;
strcpy(this->id,id);
}
//信息录入
void input(){
int year,month,day;
cout<<"姓名:";
cin>>name;
cout<<"编号:";
cin>>number;
cout<<"性别:";
cin>>sex;
cout<<"身份证号:";
cin>>id;
cout<<"出生日期(用空格隔开):";
cin>>year>>month>>day;
flag=true;//存储信息后标记为true
birthday.InDateInformation(year,month,day);
}
//信息显示
void display(){
cout<<endl
<<"姓名:"<<name<<endl
<<"编号:"<<number<<endl
<<"性别:"<<sex<<endl;
birthday.OutDateInformation();
cout<<"身份证号:"<<id<<endl;
}
//拷贝构造函数
People(People &p){
strcpy(name,p.name);
strcpy(number,p.number);
sex=p.sex;
birthday=p.birthday;
strcpy(id,p.id);
flag=p.flag;
}
//获取当前存储状态
bool GetFlag(){
return flag;
}
private:
Date birthday;//内嵌日期类对象
char name[11];//姓名
char number[7];//编号
char sex;//性别 (f:女, m:男)
char id[16];//身份证号
bool flag=false;//标记信息是否存在,初始为空
};
//学生类student
class student:virtual public People{
public:
//无参构造函数
student(){}
//有参构造函数
student(char *classNo){
strcpy(this->classNo,classNo);
}
//信息录入
void input(){
cout<<"班号:";
cin>>classNo;
}
//信息显示
void display(){
cout<<"班号::"<<classNo<<endl;
}
private:
char classNo[7];//班号
};
//教师类teacher
class teacher:virtual public People{
public:
//无参构造函数
teacher(){}
//有参构造函数
teacher(char *principalship,char *department){
strcpy(this->principalship,principalship);
strcpy(this->department,department);
}
//信息录入
void input(){
People::input();//基本信息
cout<<"职务:";
cin>>principalship;
cout<<"部门:";
cin>>department;
}
//信息显示
void display(){
People::display();
cout<<"职务:"<<principalship<<endl
<<"部门:"<<department<<endl;
}
private:
char principalship[11];//职务
char department[21];//部门
};
//研究生graduate
class graduate:virtual public student{
public:
//无参构造函数
graduate(){}
//有参构造函数
gruduate(char *principalship){
strcpy(this->subject,subject);
}
//信息录入
void input(){
People::input();//基本信息
student::input();//班号
cout<<"专业:";
cin>>subject;
}
//信息显示
void display(){
People::display();
student::display();
cout<<"专业:"<<subject<<endl;
}
private:
teacher adviser;//导师
char subject[21];//专业
};
//助教 TA
class TA:virtual public graduate,virtual public teacher{
public:
//无参构造函数
TA(){}
//信息录入
void inputG(){
graduate::input();//研究生信息
}
void inputT(){
teacher::input();//导师信息
}
void displayG(){
graduate::display();//研究生信息
}
void displayT(){
teacher::display();//导师信息
}
bool GetFlag(){
return People::GetFlag();
}
};
int main(){
TA gInformation[10];//对象数组
TA tInformation[10];
int choose;
cout<<endl
<<"1.录入研究生信息"<<endl
<<"2.显示研究生信息"<<endl
<<"3.录入导师信息"<<endl
<<"4.显示导师信息"<<endl
<<"0.退出"<<endl<<endl;
cout<<endl<<"请选择:";
cin>>choose;
while(choose!=0){
switch(choose){
case 1:{
cout<<endl<<"请输入研究生信息(f:女,m:男)"<<endl;
for(int i=0;i<10;i++){
if(!(gInformation[i].GetFlag())){
gInformation[i].inputG();//调用函数
break;
}
}
break;
}
case 2:{
cout<<endl<<"研究生信息如下:";
for(int i=0;i<10;i++){
if(gInformation[i].GetFlag()){
gInformation[i].displayG();//调用函数
}
}
break;
}
case 3:{
cout<<endl<<"请输入导师信息(f:女,m:男)"<<endl;
for(int i=0;i<10;i++){
if(!(tInformation[i].GetFlag())){
tInformation[i].inputT();//调用函数
break;
}
}
break;
}
case 4:{
cout<<endl<<"导师信息如下:";
for(int i=0;i<10;i++){
if(tInformation[i].GetFlag()){
tInformation[i].displayT();//调用函数
}
}
break;
}
default:{
cout<<"您的选择不正确,请重新输入!"<<endl;
break;
}
}
cout<<endl<<"请选择:";
cin>>choose;
}
return 0;
}