C++程序设计基础9:继承与多态性

139 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

本文为笔者大一《面向对象程序设计》课程章节实验报告,现将题目整理并分享,希望能够帮助正在学习C++的小伙伴!本文将学习到的编程技能包括:类的继承方法、访问权限问题

知识提纲

类的继承方法、访问权限问题

  • 继承方式限定了基类成员在派生类中的访问权限,包括: public(公有的)、private(私有的)和 protected(受保护的)。默认为 private,指明基类成员在派生类中的最高访问权限的。
  • 如:通过private继承public类后public的成员变量变为子类的private成员变量。

类的多态性

  • 多态性指的是调用一个函数时,根据函数参数的类型、个数不同或调用时的对象不同能产生不同的行为。
  • 如:子类继承基类后可重写基类的函数A,通过子类实例化对象调用名字A的函数时,调用的是子类重写的函数A。

一、校园人员信息录入与显示(类实现)

  • 题目: 编写一个人员信息管理系统。这个系统的功能是:交互式的实现校园人员信息的录入与显示。
  • 分析:
    • 学校里,主要有四类人员:大学本科学生、教师、研究生和助教。
    • 大学本科生每周有固定的学时数。教师除了固定的学时数外,还有每周的教学时数。研究生除了固定的学时数外,每周还可以自由做一定的研究。助教生除了上课外,还要做研究和一定的教学工作。
    • 人员的基本信息包括姓名、编号、性别、身份证号、总学时数以及每周固定学时数。各个人员之间的关系: people类派生出student 类和teacher类,student 类派生出graduate类, graduate类和teacher类派生出TA类。
    • 按下给出的类设计架构完成人员信息管理系统:
#include < iostream>
class people
{ 
public:
	//添加程序
private:
};
class student: virtual public people
{
public:
	//添加程序
private:
};
class teacher:virtual public people
{
public:
	//添加程序
private:
};
class graduate: virtual public student
{
public:
	//添加程序
private:
};
class TA : public graduate, public teacher
{
public:
	//添加程序
private:
};
void main()
{
	//添加程序
}

  • 代码
#include "pch.h"
#include < iostream>
#include <string>
using namespace std;

class people  //基类
{
public:
	people()
	{
		weekTime = 0;
		totalTime = 0;
	}
	void setCode(int mcode);
	void setName(string mname);
	void setSex(string msex);
	void setId(string mId);
	void setWeekTime(double wtime);
	void setTotalTime(double tTime);
	string getName();
	string getSex();
	int getCode();
	string getId();
	double getWeekTime();
	double getTotalTime();
	virtual void input() = 0;
	virtual void print() = 0;

private:
	string name;  //姓名
	string sex;  //性别
	string id;  //身份证号
	int code;  //编号
	double weekTime;  //每周基本学时
	double totalTime;  //总学时

};
void people::setCode(int mcode)
{
	code = mcode;
}
void people::setName(string mname)
{
	name = mname;
}
void people::setSex(string msex)
{
	sex = msex;
}
void people::setId(string mId)
{
	id = mId;
}
void people::setWeekTime(double wtime)
{
	weekTime = wtime;
}
void people::setTotalTime(double tTime)
{
	totalTime = tTime;
}
string people::getName()
{
	return name;
}
string people::getSex()
{
	return sex;
}
int people::getCode()
{
	return code;
}
string people::getId()
{
	return id;
}
double people::getWeekTime()
{
	return weekTime;
}
double people::getTotalTime()
{
	return totalTime;
}

//**********************************************************************************************************

class student : virtual public people  //学生类
{
public:
	virtual void input();
	virtual void print();
private:
};

void student::input()
{
	cout << "请输入本科生信息\n";
	cout << "姓名  性别  身份证号  每周固定学时数\n";
	string mName, mSex;
	string mID;
	double mWeekTime;
	cin >> mName >> mSex >> mID >> mWeekTime;
	setName(mName);
	setSex(mSex);
	setId(mID);
	setWeekTime(mWeekTime);
	double totalTime = mWeekTime;
	setTotalTime(totalTime);
}
void student::print()
{
	cout << "学生:  " << getName() << '\t' << "编号:" << getCode() << '\t' << getSex() << '\t' << getId() << '\t' <<"固定学时:"<<getWeekTime()<<'\t'<< "总学时:"<<getTotalTime()<<endl;
}
//**********************************************************************************************************

class teacher :virtual public people  //教师类
{
public:
	teacher();
	virtual void input();
	virtual void print();
	virtual double getTeachTime();
	void setTeachTime(double mTeachTime);
private:
	double teachTime;  //每周教学时长
};

teacher::teacher()
{
	teachTime = 0;
}
void teacher::setTeachTime(double mTeachTime)
{
	teachTime = mTeachTime;
}
double teacher::getTeachTime()
{
	return teachTime;
}
void teacher::input()
{
	cout << "请输入教师信息\n";
	cout << "姓名  性别  身份证号  每周固定学时数  每周教学时长\n";
	string mName, mSex;
	string mID;
	double mWeekTime, mTeachTime;
	cin >> mName >> mSex >> mID >> mWeekTime >> mTeachTime;
	setName(mName);
	setSex(mSex);
	setId(mID);
	setWeekTime(mWeekTime);
	setTeachTime(mTeachTime);
	double totalTime = mWeekTime + mTeachTime;
	setTotalTime(totalTime);
}
void teacher::print()
{
	cout << "教师:  " << getName() << '\t' << "编号:" << getCode() << '\t' << getSex() << '\t' << getId() << '\t' << "固定学时:" << getWeekTime() <<"周教学时长:"<<teachTime<< '\t' << "总学时:" << getTotalTime() << endl;
}
//**********************************************************************************************************

class graduate : virtual public student  //研究生类
{
public:
	graduate();
	void setStudyTime(double mStudyTime);
	virtual void input();
	virtual void print();
private:
	double studyTime;  //研究时长
};
graduate::graduate()
{
	studyTime = 0;
}
void graduate::setStudyTime(double mStudyTime)
{
	studyTime = mStudyTime;
}
void graduate::input()
{
	cout << "请输入研究生信息\n";
	cout << "姓名  性别  身份证号  每周固定学时数  每周研究时长\n";
	string mName, mSex;
	string mID;
	double mWeekTime, mStudyTime;
	cin >> mName >> mSex >> mID >> mWeekTime >> mStudyTime;
	setName(mName);
	setSex(mSex);
	setId(mID);
	setWeekTime(mWeekTime);
	setStudyTime(mStudyTime);
	double totalTime = mWeekTime + mStudyTime;
	setTotalTime(totalTime);
}
void graduate::print()
{
	cout << "研究生:  " << getName() << '\t' << "编号:" << getCode() << '\t' << getSex() << '\t' << getId() << '\t' << "固定学时:" << getWeekTime() << "周研究时长:" << studyTime << '\t' << "总学时:" << getTotalTime() << endl;
}
//**********************************************************************************************************

class TA : public graduate, public teacher  //助教生类(上课+研究)
{
public:
	void input();
	virtual void print();
private:
};
void TA::input()
{
	cout << "请输入助教生生信息\n";
	cout << "姓名  性别  身份证号  每周固定学时数  每周研究时长  每周教学时长\n";
	string mName, mSex;
	string mID;
	double mWeekTime, mStudyTime, mTeachTime;
	cin >> mName >> mSex >> mID >> mWeekTime >> mStudyTime >> mTeachTime;
	setName(mName);
	setSex(mSex);
	setId(mID);
	setWeekTime(mWeekTime);
	setStudyTime(mStudyTime);
	setTeachTime(mTeachTime);
	double totalTime = mWeekTime + mStudyTime + mTeachTime;
	setTotalTime(totalTime);
}
void TA::print()
{
	cout << "助教生:  " << getName() << '\t' << "编号:" << getCode() << '\t' << getSex() << '\t' << getId() << '\t' << "固定学时:" << getWeekTime() << "周研究时长:" << getTeachTime() << '\t' << "总学时:" << getTotalTime() << endl;
}
//**********************************************************************************************************

int main()
{
	int num = 0;
	int studentNum = 10000;
	int teacherNum = 20000;
	int graduateNum = 30000;
	int taNum = 40000;
	people* p[10000];
	cout << "\n____________________校园人员信息管理系统____________________\n\n";
	while (1)
	{
		string choose;
		cout << "请选择录入信息or显示校园人员信息(1 or 2): ";
		cin >> choose;
		if (choose == "1")
		{
			cout << "请输入要录入的人员类别(1.本科生,2.教师,3.研究生,4.助教生):";
			string op;
			cin >> op;
			if (op == "1")
			{
				p[num] = new student();
				p[num]->setCode(studentNum);
				p[num]->input();  //"->"不能写成"."
			//	p[num++]->print();
				++studentNum;
				num++;
			}
			else if (op == "2")
			{
				p[num] = new teacher();
				p[num]->setCode(teacherNum);
				p[num]->input();
			//	p[num++]->print();
				++teacherNum;
				num++;
			}
			else if (op == "3")
			{
				p[num] = new graduate();
				p[num]->setCode(graduateNum);
				p[num]->input();
			//	p[num++]->print();
				++graduateNum;
				num++;
			}
			else if (op == "4")
			{
				p[num] = new TA();
				p[num]->setCode(taNum);
				p[num]->input();
			//	p[num++]->print();
				++taNum;
				num++;
			}
			else
			{
				cout << "输入有误,请重新输入\n";
			}
		}
		else if (choose == "2")
		{
			cout << endl;
			cout << "学生信息:\n";
			if (studentNum == 10000) cout << "无\n";
			for (int i = 0; i < num; ++i)
			{
				if (p[i]->getCode() >= 10000 && p[i]->getCode() < 20000) p[i]->print();
			}
			cout << endl;
			cout << "教师信息:\n";
			if (teacherNum == 20000) cout << "无\n";
			for (int i = 0; i < num; ++i)
			{
				if(p[i]->getCode()>=20000&&p[i]->getCode()<30000) p[i]->print();
			}
			cout << endl;
			cout << "研究生信息:\n";
			if (graduateNum == 30000) cout << "无\n";
			for (int i = 0; i < num; ++i)
			{
				if (p[i]->getCode() >= 30000 && p[i]->getCode() < 40000) p[i]->print();
			}
			cout << endl;
			cout << "助教生信息:\n";
			if (taNum == 40000) cout << "无\n";
			for (int i = 0; i < num; ++i)
			{
				if (p[i]->getCode() >= 40000 && p[i]->getCode() < 50000) p[i]->print();
			}
		}
		else cout << "输入有误!请重新输入!\n";
	}
}

  • 结果 在这里插入图片描述