继承和派生 写C++实现公司工资管理系统

用 C++ 编写一个程序来实现小型公司的工资管理系统。公司有四类人员:经理(manager)、技术人员(technician)、销售员(salesman)、销售经理(salesmanager),每类人员的工资计算方式不同。


需求分析:

  1. 所有员工都有编号、姓名、月工资信息。
  2. 工资计算方法:
    • 经理:固定月薪 8000 元
    • 技术人员:每小时 100 元 → 需要输入工作小时数
    • 销售员:当月销售额的 4% 提成 → 需要输入销售额
    • 销售经理:固定月薪 5000 + 所管辖部门当月销售额的 5% → 需要输入销售额
  3. 要求:计算并显示所有职员的月工资和全部信息。

设计思路:

  • 使用面向对象编程(OOP):
    • 定义基类 Employee,包含公共属性:编号、姓名、月工资。
    • 派生出四个子类:Manager, Technician, Salesman, SalesManager
    • 每个子类重写 calculateSalary() 方法,实现各自的工资计算逻辑。
    • 使用虚函数支持多态,便于统一处理不同类型员工。
  • 主程序中创建多个员工对象,调用其 calculateSalary()displayInfo() 方法。

C++ 代码实现:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 基类:员工
class Employee {
protected:
    int id;
    string name;
    double salary;

public:
    Employee(int i, string n) : id(i), name(n), salary(0) {}
    virtual ~Employee() = default;

    virtual void calculateSalary() = 0; // 纯虚函数,由子类实现
    virtual void displayInfo() const {
        cout << "编号: " << id << ", 姓名: " << name << ", 月工资: " << salary << " 元" << endl;
    }

    double getSalary() const { return salary; }
};

// 经理类
class Manager : public Employee {
public:
    Manager(int i, string n) : Employee(i, n) {}

    void calculateSalary() override {
        salary = 8000.0;
    }
};

// 技术人员类
class Technician : public Employee {
private:
    int hours;

public:
    Technician(int i, string n, int h) : Employee(i, n), hours(h) {}

    void calculateSalary() override {
        salary = hours * 100.0;
    }

    void displayInfo() const override {
        cout << "编号: " << id << ", 姓名: " << name 
             << ", 工作小时: " << hours << ", 月工资: " << salary << " 元" << endl;
    }
};

// 销售员类
class Salesman : public Employee {
private:
    double sales;

public:
    Salesman(int i, string n, double s) : Employee(i, n), sales(s) {}

    void calculateSalary() override {
        salary = sales * 0.04;
    }

    void displayInfo() const override {
        cout << "编号: " << id << ", 姓名: " << name 
             << ", 销售额: " << sales << ", 月工资: " << salary << " 元" << endl;
    }
};

// 销售经理类
class SalesManager : public Employee {
private:
    double departmentSales;

public:
    SalesManager(int i, string n, double ds) : Employee(i, n), departmentSales(ds) {}

    void calculateSalary() override {
        salary = 5000.0 + departmentSales * 0.05;
    }

    void displayInfo() const override {
        cout << "编号: " << id << ", 姓名: " << name 
             << ", 部门销售额: " << departmentSales << ", 月工资: " << salary << " 元" << endl;
    }
};

int main() {
    vector<Employee*> employees;

    // 创建员工对象(示例数据)
    employees.push_back(new Manager(1, "张三"));
    employees.push_back(new Technician(2, "李四", 160));      // 160小时
    employees.push_back(new Salesman(3, "王五", 50000));       // 销售额5万
    employees.push_back(new SalesManager(4, "赵六", 80000));   // 部门销售额8万

    // 计算工资并显示信息
    cout << "=== 公司员工工资信息 ===" << endl;
    for (auto emp : employees) {
        emp->calculateSalary();
        emp->displayInfo();
    }

    // 清理内存
    for (auto emp : employees) {
        delete emp;
    }

    return 0;
}

运行效果示例:

=== 公司员工工资信息 ===
编号: 1, 姓名: 张三, 月工资: 8000 元
编号: 2, 姓名: 李四, 工作小时: 160, 月工资: 16000 元
编号: 3, 姓名: 王五, 销售额: 50000, 月工资: 2000 元
编号: 4, 姓名: 赵六, 部门销售额: 80000, 月工资: 9000 元

说明:

  • 使用了继承与多态,符合面向对象设计原则。
  • 可根据实际需要扩展更多员工类型或添加输入功能(如从键盘读取数据)。
  • 内存管理使用 delete 释放动态分配的对象,避免泄漏。

📌 提示: 如果希望交互式输入员工数据,可以在 main() 中添加循环让用户输入每种员工的参数。

如需扩展功能(如保存到文件、按类型筛选等),可在此基础上继续开发。


✅ 此代码完全满足题目要求,结构清晰,易于维护和扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值