要求:
(1)由“房间”基类派生“教室”、“办公室”、“实验室”三个派生类,要求如下:
“教室”类包含:楼号、房间号、座位数、责任人(由1名行政人员担任);
“办公室”类包含:楼号、房间号、人员数量、行政人员1、行政人员2、…;
“实验室”类包含:楼号、房间号、教师数量、学生数量、教师1、教师2、…、学生1、学生2、…;
(2)其中“学生”、“教师”、“行政”三个派生类由“人员”基类派生,要求如下:
“学生”类包含:姓名、性别、学院、年龄、入学年份、专业;
“教师”类包含:姓名、性别、学院、年龄、职称、研究方向;
“行政”类包含:姓名、性别、学院、年龄、负责工作;
实验要求:
(1)请根据以上需求描述定义相应的基类与派生类,根据需求定义构造、析构、显示信息等成员函数;
(2)编写主程序验证功能,定义以下对象并在控制台输出相关信息:
教室1间;
办公室1间(包含至少2名行政);
实验室1间(包含至少2名教室、3名学生);
(3)注意:输出信息时要求通过运行时的多态实现;
一些相关问题:
1.“房间”基类中包含哪些数据成员?“人员”基类中包含哪些数据成员?
“房间”基类包含楼号和房间号;“人员”基类包含姓名、性别、学院、年龄;
2.结合需求,分析类与类之间的继承、聚合关系(哪些需要用到继承、多重继承?哪些需要使用聚合?);
①“房间”类和“人员”类都是基类,学生,教师,行政人员类均继承于“人员类”;
②而“教室”类需要一名行政人员,同时需要继承于“房间”类和“行政人员”类,这是多重继承;
③而“办公室”类,需要至少俩名行政人员,“实验室”类需要至少俩名教师和三名学生,他们都继承于“房间”类,但是需要一名以上的行政人员,教师,学生,不能区分,因此需要用到聚合;
3.简述赋值兼容原则;
赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。
即以“房间”基类为例,“教室”、“办公室”、“实验室”三个派生类继承了“房间”基类的楼号和房间号,即既可以实现房间的功能也可以实现它自身特有的功能,而反过来“房间”基类不能实现派生类的功能;
4.结合代码,简述如何实现运行时的多态性。
运行时多态性:C++运行时多态性主要是通过虚函数来实现的。体现在具有继承关系的父类和子类之间,子类重新定义父类的成员函数成为覆盖或者重写,而虚函数允许子类重新定义父类的成员函数,即重写父类的成员函数。
C++代码:
#include<iostream>
#include<string>
using namespace std;
enum Tsex {
mid, man, woman };
class Person {
private:
string Name; //姓名
Tsex Sex; //性别
string Academy; //学院
int Age; //年龄
public:
Person(string name, Tsex sex, string academy, int age)
{
Name = name;
Sex = sex;
Academy = academy;
Age = age;
}
Person() {
};
~Person() {
};
virtual void printInfo() {
//定义为虚函数,方便实现运行多态
cout << "姓名:" << Name << endl;
cout << "性别:";
switch (Sex) {
case 0:
cout << "mid" << endl; break;
case 1:
cout << "男" << endl; break;
case 2:
cout << "女" << endl;
}
cout << "学院:" << Academy << endl;
cout << "年龄:" << Age << endl;
}
};
class Student :public Person {
private:
int EntryYear; //入学年份
string Major; //专业
public:
Student(string, Tsex, string, int, int, string);
Student() {
};
~Student() {
};
void printInfo() //虚函数,打印学生情况
{
Person::printInfo();
cout << "入学年份:" << EntryYear << endl;
cout << "专业:" << Major << endl;
}
};
Student::Student(string name, Tsex sex, string academy, int age, int entryyear, string major) :Person(name, sex, academy, age) {
EntryYear = entryyear;
Major = major;
}
class Teacher :public Person {
private:
string AcademicTitle; //职称
string ResearchDir; //研究方向
public