本关任务: Teacher类和Student类中包含相同的属性,所以可以抽象出一个新的Person类作为Teacher类和Student类的父类,各个类的信息如下: Person类: 数据成员: 姓名(name)、年龄(age)、性别(sex) 成员函数: Person类的构造函数初始化数据成员,showMe成员函数显示数据成员的值。 Teacher类: 数据成员: 专业(dept)、月薪(salary) 成员函数: Teacher类的构造函数初始化数据成员,showMe成员函数显示数据成员的值。 Student类 数据成员: 班级(class)、学号(ID) 成员函数: Student类的构造函数初始化数据成员,showMe成员函数显示数据成员的值。 Graduate类: 成员函数: Graduate类的构造函数初始化数据成员,showMe成员函数显示各个数据成员的值。 提示: (1)Graduate的父类是Student和Teacher,而Student和Teacher有共同的父类Person, 如果是普通继承则姓名、性别和年龄就发生了重复。因此,这一题需要用到虚基类的概念。 (2)注意showMe()成员函数在每个类里都有。
时间: 2024-02-18 22:04:10 浏览: 121
Person类派生出Teacher和Student
3星 · 编辑精心推荐
下面是各个类的代码实现:
```c++
#include <iostream>
#include <string>
using namespace std;
class Person{
protected:
string name;
int age;
char sex;
public:
Person(string n, int a, char s):name(n), age(a), sex(s){}
void showMe(){
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Sex: " << sex << endl;
}
};
class Teacher: virtual public Person{
protected:
string dept;
double salary;
public:
Teacher(string n, int a, char s, string d, double sal):Person(n, a, s), dept(d), salary(sal){}
void showMe(){
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Sex: " << sex << endl;
cout << "Department: " << dept << endl;
cout << "Salary: " << salary << endl;
}
};
class Student: virtual public Person{
protected:
string cls;
int ID;
public:
Student(string n, int a, char s, string c, int id):Person(n, a, s), cls(c), ID(id){}
void showMe(){
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Sex: " << sex << endl;
cout << "Class: " << cls << endl;
cout << "ID: " << ID << endl;
}
};
class Graduate: public Teacher, public Student{
public:
Graduate(string n, int a, char s, string d, double sal, string c, int id):Person(n, a, s), Teacher(n, a, s, d, sal), Student(n, a, s, c, id){}
void showMe(){
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Sex: " << sex << endl;
cout << "Department: " << dept << endl;
cout << "Salary: " << salary << endl;
cout << "Class: " << cls << endl;
cout << "ID: " << ID << endl;
}
};
```
注释:
- Person类是基类,有name、age和sex三个数据成员和一个构造函数和showMe()成员函数。
- Teacher类和Student类都是虚继承Person类,分别有dept和salary、cls和ID两个数据成员和一个构造函数和showMe()成员函数。
- Graduate类继承了Teacher类和Student类,因此需要在构造函数中分别调用Teacher类和Student类的构造函数来初始化数据成员。同时,继承了Teacher类和Student类的showMe()函数,需要在Graduate类中重新定义showMe()函数以显示所有数据成员的值。
注意:由于Teacher类和Student类都是虚继承Person类,因此在构造函数中不需要再次初始化Person类的数据成员,而是由Person类的构造函数进行初始化。同时,需要在Graduate类的构造函数中向Teacher类和Student类的构造函数传递Person类的数据成员,因为Person类是虚基类,不会在Teacher类和Student类中重复出现。
阅读全文