欢迎光临
我们一直在努力

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

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


✅ 需求分析:

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

  • ✅ 设计思路:

    • 使用面向对象编程(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() 中添加循环让用户输入每种员工的参数。

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


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

    赞(0)
    未经允许不得转载:171主机测评 » 继承和派生 写C++实现公司工资管理系统
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址