(C++实例)实现people类、student类,teacher类、graduate类、助教类继承和派生并测试

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;
}

3.运行结果

  • 8
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。
面向对象程序设计技术课程设计<br>1.建立一个类簇,描述队列,栈以及优先级队列。要求如下:<br>(1)建立一个一个抽象基类AbDataStrucBase。它是队列类Queue,栈类Stack以及优先级队列类Pqueue的基类。具有插入Add以及删除Remove成员函数;判空操作Isempty,判满操作Full;一个用以保存整数类型数据的一维数组指针;<br>(2)定义一个队列类Queue,它从AbDataStrucBase派生实现其必要的操作成员函数;<br>(3)定义一个队列类Pqueue,它从AbDataStrucBase派生实现其必要的操作成员函数;<br>以上各类,为其设计所需要的各种构造函数,析构函数。注意成员覆盖,虚函数的使用。<br>2.建立一个类簇,要求如下:<br>(1)建立一个日期类date。包含年、月以及日属性。建立一个课程类Cources,包括课程名字,课程号,上课老师,上课地点,学分,成绩;<br>(2)建立一个人(people)数据类型,包括以下属性:<br>姓名char name[11] ; 编号 char number[7]; 性别 char sex[3] ;生日 birthday ;身份证号 char id[16];课程表Stu Cources[7] 。birthday为日期类型内嵌对象;StuCources是Cources类型的内嵌对象数组;<br>(3)从people派生student类,添加属性:班号 Char classNo[7];<br>(4)从people派生Teacher类,添加属性:职务 char principalship[11]、部门char department[21];<br>(5)从student类中派生出研究生(graduate)类,添加属性:专业 char subject[21]、导师 teacher_adviser;<br>(6)从graduate类和teacher派生TA(助教)类,注意使用虚基类;<br>(7)实现学生选课管理系统。<br>以上类要有构造/析构函数,拷贝构造函数。<br><br>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值