设计一个用于人事管理的“People”基类,考虑到通用性,仅抽象出各类人员都具有的属性:编号、姓名、性别、出生日期、身份证号等;从People(人员)类派生出学生类Student,并添加属性:班号classNo;从People类派生出教师类Teacher,并添加属性:职务principalship、部门department;从Student类中派生出Graduate(研究生)类,添加属性:专业subject、导adviser(Teacher类对象);从Graduate类和teacher类派生出助教生类TA。设计时注意虚基类的使用注意重载相应的成员函数。编写main函数测试这些类。在main函数中设计测试用例时注意考虑如何体现成员函数的覆盖。老师将根据设计封装的合理性、测试用例周全性进行评分。
【UML图】
【代码】
#include<iostream>
#include<string>
using namespace std;
//人
class People {
protected:
string number;
string name;
string sex;
string birthday;
string id;
public:
People(string nu,string na,string s,string b,string i):
number(nu),name(na),sex(s),birthday(b),id(i){}
//编号,姓名,性别,出生年月,身份证号
People(const People &P):
number(P.number),name(P.name),sex(P.sex),birthday(P.birthday),id(P.id){}
~People(){}
void Show()const{
cout <<"编号:"<<number<<endl
<<"姓名:"<<name<<endl
<<"性别:"<<sex<<endl
<<"出生年月:"<<birthday<<endl
<<"身份证号:"<<id<<endl;
cout<<"_______________________________________"<<endl;
}
};
//学生
class Student:virtual public People{
protected:
int classNo;
public:
Student(string nu,string na,string s,string b,string i,int c):
People(nu,na,s,b,i),classNo(c){}
//编号,姓名,性别,出生年月,身份证号,班号
Student(const Student &S):People(S),classNo(S.classNo){}
~Student(){}
void Show()const{
cout <<"编号:"<<number<<endl
<<"姓名:"<<name<<endl
<<"性别:"<<sex<<endl
<<"出生年月:"<<birthday<<endl
<<"身份证号:"<<id<<endl
<<"班号:"<<classNo<<endl;
cout<<"_______________________________________"<<endl;
}
};
//老师
class Teacher:virtual public People{
protected:
string principalship;
string department;
public:
Teacher(string nu,string na,string s,string b,string i,string p,string d):
People(nu,na,s,b,i),principalship(p),department(d){}
//编号,姓名,性别,出生年月,身份证号,职务,部门
Teacher(const Teacher &T):
People(T),principalship(T.principalship),department(T.department){}
~Teacher(){}
void Show()const{
cout <<"编号:"<<number<<endl
<<"姓名:"<<name<<endl
<<"性别:"<<sex<<endl
<<"出生年月:"<<birthday<<endl
<<"身份证号:"<<id<<endl
<<"职务:"<<principalship<<endl
<<"部门:"<<department<<endl;
cout<<"_______________________________________"<<endl;
}
};
//研究生
class Graduate:public Student{
protected:
string subject;
Teacher adviser;
public:
Graduate(string nu,string na,string s,string b,string i,int c,string sub,Teacher a):
People(nu,na,s,b,i),Student(nu,na,s,b,i,c),subject(sub),adviser(a){}
//编号,姓名,性别,出生年月,身份证号,班号,专业,导师
Graduate(const Graduate &G):
People(G),Student(G),subject(G.subject),adviser(G.adviser){}
~Graduate(){}
void Show()const{
cout <<"编号:"<<number<<endl
<<"姓名:"<<name<<endl
<<"性别:"<<sex<<endl
<<"出生年月:"<<birthday<<endl
<<"身份证号:"<<id<<endl
<<"班号:"<<classNo<<endl
<<"专业:"<<subject<<endl
<<"____________"<<endl;
cout<<"导师信息:"<<endl;
adviser.Show();
}
};
//助教生
class TA:public Graduate,public Teacher{
public:
TA(string nu,string na,string s,string b,string i,int c,string sub,Teacher a,string p,string d):People(nu,na,s,b,i),Graduate(nu,na,s,b,i,c,sub,a),Teacher(nu,na,s,b,i,p,d){}
//编号,姓名,性别,出生年月,身份证号,班号,专业,导师,职务,部门
TA(const TA&T):People(T),Graduate(T),Teacher(T){}
~TA(){}
void Show()const{
cout <<"编号:"<<number<<endl
<<"姓名:"<<name<<endl
<<"性别:"<<sex<<endl
<<"出生年月:"<<birthday<<endl
<<"身份证号:"<<id<<endl
<<"班号:"<<classNo<<endl
<<"专业:"<<subject<<endl
<<"职务:"<<principalship<<endl
<<"部门:"<<department<<endl
<<"____________"<<endl;
cout<<"导师信息:"<<endl;
adviser.Show();
}
};
提供一个简单的测试main函数:
int main(){
Teacher zhangsan("208","张三","女","20010504","2900620105041230","程序设计老师","C语言部");
TA t("201131380","李四","男","20001230","290200012300326",3,"软件工程",zhangsan,"学生","领航");
t.People::Show();
t.Student::Show();
t.Teacher::Show();
t.Graduate::Show();
t.Show();
return 0;
}
代码如果有什么需要完善的地方还请留言指出!谢谢大家!
(这个只能作为参考还是要自己敲代码,不然作用不大!)