编写程序(虚函数和多态):(习题8.7)某公司雇员(employee)包括经理(manager),技术人员(technician)和销售员(salesman)。开发部经理(developermanger),既是经理也是技术人员。销售部经理(salesmanager),既是经理也是销售员。 以employ类为虚基类派生出manager,technician和salesman类;再进一步派生出developermanager和salesmanager类。 employee类的属性包括姓名、职工号、工资级别,月
时间: 2024-01-21 07:02:28 浏览: 230
以下是一个使用虚函数和多态的示例程序:
```c++
#include <iostream>
#include <string>
using namespace std;
// 雇员基类
class Employee {
protected:
string name; // 姓名
string id; // 职工号
int level; // 工资级别
public:
Employee(string n, string i, int l): name(n), id(i), level(l) {}
virtual double pay() = 0; // 纯虚函数,用于计算工资
virtual void print() { // 打印员工信息
cout << "姓名:" << name << ",职工号:" << id << ",工资级别:" << level;
}
};
// 经理类
class Manager : public virtual Employee {
protected:
double salary; // 固定工资
public:
Manager(string n, string i, int l, double s): Employee(n, i, l), salary(s) {}
virtual double pay() { // 计算工资
return salary;
}
virtual void print() { // 打印员工信息
Employee::print();
cout << ",工资:" << pay() << endl;
}
};
// 技术人员类
class Technician : public virtual Employee {
protected:
double wage; // 每小时工资
double hours; // 工作时长
public:
Technician(string n, string i, int l, double w, double h): Employee(n, i, l), wage(w), hours(h) {}
virtual double pay() { // 计算工资
return wage * hours;
}
virtual void print() { // 打印员工信息
Employee::print();
cout << ",工资:" << pay() << endl;
}
};
// 销售员类
class Salesman : public virtual Employee {
protected:
double commission; // 销售佣金
double sales; // 销售额
public:
Salesman(string n, string i, int l, double c, double s): Employee(n, i, l), commission(c), sales(s) {}
virtual double pay() { // 计算工资
return commission * sales;
}
virtual void print() { // 打印员工信息
Employee::print();
cout << ",工资:" << pay() << endl;
}
};
// 开发部经理类
class DeveloperManager : public Manager, public Technician {
public:
DeveloperManager(string n, string i, int l, double s, double w, double h): Employee(n, i, l), Manager(n, i, l, s), Technician(n, i, l, w, h) {}
virtual double pay() { // 计算工资
return Manager::pay() + Technician::pay();
}
virtual void print() { // 打印员工信息
Employee::print();
cout << ",工资:" << pay() << endl;
}
};
// 销售部经理类
class SalesManager : public Manager, public Salesman {
public:
SalesManager(string n, string i, int l, double s, double c, double sa): Employee(n, i, l), Manager(n, i, l, s), Salesman(n, i, l, c, sa) {}
virtual double pay() { // 计算工资
return Manager::pay() + Salesman::pay();
}
virtual void print() { // 打印员工信息
Employee::print();
cout << ",工资:" << pay() << endl;
}
};
int main() {
Employee *e1 = new Manager("张三", "001", 1, 5000);
Employee *e2 = new Technician("李四", "002", 2, 50, 160);
Employee *e3 = new Salesman("王五", "003", 3, 0.1, 100000);
Employee *e4 = new DeveloperManager("赵六", "004", 4, 8000, 60, 200);
Employee *e5 = new SalesManager("钱七", "005", 5, 10000, 0.05, 500000);
e1->print();
e2->print();
e3->print();
e4->print();
e5->print();
delete e1;
delete e2;
delete e3;
delete e4;
delete e5;
return 0;
}
```
在这个程序中,我们定义了一个雇员基类 `Employee`,包含雇员的姓名、职工号和工资级别,并定义了一个纯虚函数 `pay()`,用于计算员工的工资。然后我们派生出了三个类:经理 `Manager`、技术人员 `Technician` 和销售员 `Salesman`,分别实现了自己的工资计算方法,并重写了基类的 `print()` 函数,用于打印员工的信息。
由于开发部经理和销售部经理都既是经理又是技术人员或销售员,因此我们使用了虚基类继承的方式,派生出了 `DeveloperManager` 和 `SalesManager` 两个类。这两个类分别继承了经理和技术人员或销售员的属性和方法,并重写了 `pay()` 和 `print()` 函数。
在 `main()` 函数中,我们创建了五个不同的员工,并用基类的指针指向它们,然后依次调用它们的 `print()` 函数,实现了多态性。最后别忘了释放内存。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044937.png)
![-](https://img-home.csdnimg.cn/images/20241231044937.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![ppt](https://img-home.csdnimg.cn/images/20241231044937.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)