C++继承派生题“People”虚基类

设计一个用于人事管理的“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;
}

代码如果有什么需要完善的地方还请留言指出!谢谢大家!
(这个只能作为参考还是要自己敲代码,不然作用不大!)

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1 、先定义一个学生类student,其私有成员分别为(学号、生名、性别)3个,再定义一个研究生类graduate(私有成员分别为:学号、生名、性别、年龄、地址)5个。其中研究生类从学生类继承过来,分别采用公有继承与私有继承、保护继承三种方式,程序中包括输入数据的函数,运行时输入其5项的值,程序应输出5个数据值。 答案:略 2、(1) 声明一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。 (2) 声明一个基类BaseClass,有整形成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。 (3) 声明一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motocycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。 (4)(选做)从people(人员)类派生出student(学生)类,添加属性:班号 char classNo[7];从people派生出teacher(教师)类,添加属性:职务char principalship[11]、 部门char department[21]。从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacherradviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值