分别定义一个教师类Teacher和干部类Leader,采用多重继承派生一个新类一双职教师类DbTeacher。假设要管理下述几类人员的一些相关数据: 教师类:姓名、性别、出生日期、职称、电话; 干部类:姓名、性别、出生日期、职务、电话; 双职教师类:姓名、性别、出生日期、职务、职称、电话、工资。 请设计每个类的构造函数及显示类对象数据的成员函数。编写主函数,测试这些类。 提示: (1)教师类和干部类都有姓名、性别、出生日期、电话等属性,请设计它们的基类一职员类Staff。 (2)理解为了避免同一基类出现多个重复的副本而采用的虚基类概念和虚拟继承,学习利用虚基类解决二义性问题。
时间: 2023-07-04 18:11:17 浏览: 107
分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求:①在两个基类中都包含
好的,以下是代码实现:
```c++
#include<iostream>
#include<string>
using namespace std;
// 职员类
class Staff{
protected:
string name; // 姓名
string gender; // 性别
string birthdate; // 出生日期
string phone; // 电话
public:
Staff(string n, string g, string b, string p):name(n),gender(g),birthdate(b),phone(p){}
virtual void display(){
cout<<"姓名:"<<name<<endl;
cout<<"性别:"<<gender<<endl;
cout<<"出生日期:"<<birthdate<<endl;
cout<<"电话:"<<phone<<endl;
}
};
// 教师类
class Teacher: virtual public Staff{
protected:
string title; // 职称
public:
Teacher(string n, string g, string b, string p, string t):Staff(n,g,b,p),title(t){}
virtual void display(){
Staff::display();
cout<<"职称:"<<title<<endl;
}
};
// 干部类
class Leader: virtual public Staff{
protected:
string position; // 职务
public:
Leader(string n, string g, string b, string p, string pos):Staff(n,g,b,p),position(pos){}
virtual void display(){
Staff::display();
cout<<"职务:"<<position<<endl;
}
};
// 双职教师类
class DbTeacher: public Teacher, public Leader{
protected:
int salary; // 工资
public:
DbTeacher(string n, string g, string b, string p, string t, string pos, int s):Staff(n,g,b,p),Teacher(n,g,b,p,t),Leader(n,g,b,p,pos),salary(s){}
virtual void display(){
Staff::display();
cout<<"职务:"<<position<<endl;
cout<<"职称:"<<title<<endl;
cout<<"工资:"<<salary<<endl;
}
};
// 主函数
int main(){
DbTeacher dt("张三","男","1990-01-01","12345678901","讲师","系主任",5000);
dt.display();
return 0;
}
```
解释一下代码:我们先定义了一个职员类 `Staff`,然后让教师类 `Teacher` 和干部类 `Leader` 都继承自这个类,因为它们有共同的属性:姓名、性别、出生日期、电话。在这里,我们使用了虚拟继承(虚基类)来避免多重继承带来的二义性问题。
然后,我们用 `Teacher` 和 `Leader` 分别派生出一个双职教师类 `DbTeacher`。在这个类里面,我们定义了一个工资属性 `salary`,并在构造函数中初始化所有属性。注意,我们需要在构造函数中调用虚基类 `Staff` 的构造函数来初始化它的属性。另外,我们还需要在 `DbTeacher` 中重新定义 `display` 函数来输出所有属性。
最后,在 `main` 函数中,我们创建了一个 `DbTeacher` 对象,并调用它的 `display` 函数来输出所有属性。
希望这个例子能够帮到你!
阅读全文