分别定义一个教师类Teacher和干部类Leader,采用多重继承来派生一个新类一双职教师类DbTeacher。假设要管理下述几类人员的一些相关数据: 教师类:姓名、性别、出生日期、职称、电话; 干部类:姓名、性别、出生日期、职务、电话; 双职教师类:姓名、性别、出生日期、职务、职称、电话、工资。 请设计每个类的构造函数及显示类对象数据的成员困数,编写主面数。测试这些类。提示: (1)教师类和干部类都有姓名、性别、出生日期、电话等属性,请设计它们的基类一职员类staff(2)理解为了通化同一站类出现多个重复的副本面采用的虚基类概念和虚拟维承,利用虚基类解决二义性问题。
时间: 2023-07-04 17:21:04 浏览: 241
好的,我会根据您的要求回答问题,以下是对应的代码实现:
```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;
}
void display(){
cout << "Name: " << name << endl;
cout << "Gender: " << gender << endl;
cout << "BirthDate: " << birthDate << endl;
cout << "Phone: " << 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;
}
void display(){
staff::display();
cout << "Title: " << title << endl;
}
};
class Leader: virtual public staff{
protected:
string duty;
public:
Leader(string n, string g, string b, string p, string d): staff(n, g, b, p){
duty = d;
}
void display(){
staff::display();
cout << "Duty: " << duty << endl;
}
};
class DbTeacher: public Teacher, public Leader{
protected:
string salary;
public:
DbTeacher(string n, string g, string b, string p, string t, string d, string s): staff(n, g, b, p), Teacher(n, g, b, p, t), Leader(n, g, b, p, d){
salary = s;
}
void display(){
staff::display();
cout << "Title: " << title << endl;
cout << "Duty: " << duty << endl;
cout << "Salary: " << salary << endl;
}
};
int main(){
DbTeacher d("Tom", "Male", "1990-01-01", "123456789", "Senior Teacher", "Department Head", "10000");
d.display();
return 0;
}
```
在这个实现中,我们定义了一个基类`staff`,它包含所有职员共有的属性,如姓名、性别、出生日期、电话等。
然后我们定义了两个派生类,`Teacher`和`Leader`,它们分别继承了`staff`类,并添加了各自特有的属性,如职称、职务等。注意到这里我们使用`virtual`关键字,标识虚继承,以解决多重继承带来的二义性问题。
最后我们定义了一个双职教师类`DbTeacher`,它通过多重继承同时继承了`Teacher`和`Leader`类,并添加了工资属性。在实现中我们需要显式调用`Teacher`和`Leader`类的构造函数,并在初始化列表中分别传递对应的参数。
为了显示类对象数据的成员信息,我们在每个类中都定义了`display`函数,它们分别打印出各自的属性信息,并在需要的时候调用基类`staff`的`display`函数。
在主函数中,我们创建了一个双职教师对象`d`,并调用其`display`函数,打印出对象的所有属性。
阅读全文