C++程序编写: 假设按月发放工资。创建各个雇员对象。多态的计算各个employee对象的工资,如果当月出现某个employee对象的生日,则将该雇员工资增加100元的奖金,如果该员工是小时工资员工,则增加10小时。编写一个主程序,实现此题。
时间: 2024-03-27 18:35:51 浏览: 71
外部的多态:一种用于透明地扩展c++具体数据类型的对象结构模式
好的,这个问题需要用到C++的面向对象编程和多态特性,实现起来比较复杂。首先,我们需要定义一个基类Employee,然后派生出HourlyEmployee和SalariedEmployee两个类,分别表示按小时计算工资和按月计算工资的雇员类型。接着,我们需要在Employee类中定义虚函数CalculateSalary(),用来计算雇员的工资。然后在HourlyEmployee和SalariedEmployee类中分别实现CalculateSalary()函数,根据不同的计费方式计算工资。最后,在Employee类中再定义一个虚函数BirthdayBonus(),用来计算雇员生日奖金。在HourlyEmployee和SalariedEmployee类中分别重写BirthdayBonus()函数,增加不同的奖金。下面是代码实现:
```cpp
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
class Employee {
public:
Employee(string name, int year, int month, int day) {
this->name = name;
birthday = timegm(&tm{0, 0, 0, day, month - 1, year - 1900});
}
virtual double CalculateSalary() = 0; // 纯虚函数,需要在子类中实现
virtual double BirthdayBonus() { return 0; } // 生日奖金,默认为0
protected:
string name;
time_t birthday;
};
class HourlyEmployee : public Employee {
public:
HourlyEmployee(string name, int year, int month, int day, double wage, double hours)
: Employee(name, year, month, day), wage(wage), hours(hours) {}
double CalculateSalary() { return wage * hours; } // 按小时计算工资
double BirthdayBonus() { return 10 * wage; } // 生日奖金,按小时计算
private:
double wage;
double hours;
};
class SalariedEmployee : public Employee {
public:
SalariedEmployee(string name, int year, int month, int day, double salary)
: Employee(name, year, month, day), salary(salary) {}
double CalculateSalary() { return salary; } // 按月计算工资
double BirthdayBonus() { return 100; } // 生日奖金,固定100元
private:
double salary;
};
int main() {
vector<Employee*> employees; // 存储雇员对象的指针
employees.push_back(new HourlyEmployee("张三", 1990, 1, 1, 50, 160)); // 小时工资员工
employees.push_back(new SalariedEmployee("李四", 1991, 2, 2, 5000)); // 按月计算工资的员工
time_t now = time(nullptr);
struct tm* ptm = localtime(&now);
for (auto emp : employees) {
double salary = emp->CalculateSalary(); // 计算基本工资
if (ptm->tm_mday == localtime(&emp->birthday)->tm_mday) {
salary += emp->BirthdayBonus(); // 生日奖金
}
cout << emp->name << "的工资是:" << salary << endl;
}
return 0;
}
```
在上面的代码中,我们先定义了一个存储Employee指针的vector容器,然后向其中添加两个雇员对象,一个是按小时计算工资的员工,一个是按月计算工资的员工。接着,我们获取当前时间,检查每个员工的生日是否与当前日期相同,如果是,则计算生日奖金。最后输出每个员工的工资。
阅读全文