设计一个虚基类Person,包含姓名和年龄私有数据成员以及相关的成员函数;由它派生出领导类Leader,包含职务和部门私有数据成员以及相关的成员函数;再由Person派生出工程师类Engineer,包含职务和专业私有数据成员以及相关的成员函数;再由Leader和Engineer类派生出主任工程师类Chairman。并采用相关数据进行测试。
时间: 2024-02-26 22:52:11 浏览: 34
好的,我可以为您解答这个问题。
以下是代码实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
class Person {
private:
string name;
int age;
public:
Person(string n, int a): name(n), age(a) {}
virtual void PrintInfo() {
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
}
};
class Leader: virtual public Person {
private:
string position;
string department;
public:
Leader(string n, int a, string p, string d): Person(n, a), position(p), department(d) {}
virtual void PrintInfo() {
Person::PrintInfo();
cout << "职务:" << position << endl;
cout << "部门:" << department << endl;
}
};
class Engineer: virtual public Person {
private:
string position;
string major;
public:
Engineer(string n, int a, string p, string m): Person(n, a), position(p), major(m) {}
virtual void PrintInfo() {
Person::PrintInfo();
cout << "职务:" << position << endl;
cout << "专业:" << major << endl;
}
};
class Chairman: public Leader, public Engineer {
public:
Chairman(string n, int a, string p1, string d, string p2, string m):
Person(n, a), Leader(n, a, p1, d), Engineer(n, a, p2, m) {}
virtual void PrintInfo() {
Person::PrintInfo();
cout << "职务:" << Leader::position << endl;
cout << "部门:" << Leader::department << endl;
cout << "专业:" << Engineer::major << endl;
}
};
int main() {
Chairman chairman("张三", 40, "主任", "研发部", "工程师", "计算机科学");
chairman.PrintInfo();
return 0;
}
```
在这个代码中,我们首先定义了一个虚基类`Person`,其中包含了姓名和年龄两个私有数据成员,以及一个`PrintInfo()`成员函数来输出这些信息。
接着,我们定义了一个派生类`Leader`,它包含了职务和部门两个私有数据成员,以及一个`PrintInfo()`成员函数,该函数调用了`Person`类的`PrintInfo()`函数,以输出姓名和年龄,并输出职务和部门信息。
我们还定义了另一个派生类`Engineer`,它包含了职务和专业两个私有数据成员,以及一个`PrintInfo()`成员函数,该函数也调用了`Person`类的`PrintInfo()`函数,以输出姓名和年龄,并输出职务和专业信息。
最后,我们定义了一个派生类`Chairman`,它同时继承了`Leader`和`Engineer`,并通过成员初始化列表将姓名和年龄传递给它们。因为`Leader`和`Engineer`都是虚继承自`Person`,所以在构造函数中只需调用一次`Person`的构造函数即可。
`Chairman`类也定义了一个`PrintInfo()`成员函数,该函数输出了姓名、年龄、职务、部门和专业等信息,并通过`Leader::position`和`Engineer::major`来访问`Leader`和`Engineer`中的私有数据成员。
最后在`main()`函数中,我们创建了一个`Chairman`对象,并调用了它的`PrintInfo()`函数来测试代码。
输出结果如下:
```
姓名:张三
年龄:40
职务:主任
部门:研发部
专业:计算机科学
```
这说明我们的类设计和继承关系是正确的,能够输出预期的信息。