【C++】【继承】小型公司人员信息管理

需求和规格说明:
某小型公司,主要有四类人员:经理、技术人员、销售经理和推销员。要求存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。

人员编号基数为1000,每输入一个人员的信息,编号顺序加1。
程序要对所有人员有提升级别的功能。为简单起见,所有人员的初始级别均为1级,然后进行升级,经理升为4级,技术人员和销售经理升为3级,推销员仍为1级。

月薪计算办法是:经理拿固定月薪8000元;技术人员按每小时100元领取月薪;推销员的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5‰。

设计:
根据上述需求,设计一个基类employee,然后派生出technician(技术人员)类、manager(经理)类和salesman(推销员)类。由于销售经理(salesmanager)既是经理又是销售人员,兼具两类人员的特点,因此同时继承manager和salesman两个类。
在基类中,除了定义构造函数和析构函数以外,还应统一定义对各类人员信息都应有的操作,这样可以规范各派生类的基本行为。但是各类人员的月薪计算方法不同,不能在基类employee中统一定义计算方法。各类人员信息的显示内容也不同,同样不能在基类中统一定义显示方法。因此,在employee类中用纯虚函数的方式定义了计算月薪函数pay()和显示信息函数displayStatus(),然后在派生类中再根据各自的同名函数实现具体的功能。
由于salesmanager的两个基类又有公共基类employee,为避免二义性,这里将employee类设计为虚基类。

Employee.h

#pragma once
// 基类员工
class Employee {
protected:
	char* name; // 姓名
	int individualEmpNo;//个人编号
	int grade; //等级
	float accumPay;//月薪总额
	static int employeeNo;//本公司职员编号目前的最大值
public:
	Employee();
	~Employee();
	void promote(int);//升级函数
	void setName();
	virtual void pay();
	virtual void displayStatus();
};
class Technician :public Employee { //技术人员
protected:
		float hourlyRate; // 每小时酬金
		int workHours; //每月工作时数
	public:
		Technician();
		void pay(); //计算月薪函数
		void displayStatus(); // 显示人员信息

};
class Manager : public Employee { //经理
protected:
		float monthlyPay;
	public:
		Manager();
		void pay(); //计算月薪函数
		void displayStatus(); // 显示人员信息
};
class SalesMan :public Employee { // 推销员
protected:
		float CommRate; //按销售额提取酬金的百分比
		float sales;//当月销售额
	public:
		SalesMan();
		void pay(); //计算月薪函数
		void displayStatus(); // 显示人员信息

};
class SalesManager :public Manager, SalesMan {
	public:
		SalesManager();
		void pay(); //计算月薪函数
		void displayStatus(); // 显示人员信息

};

empfunc.cpp

#include <iostream>
#include <string.h>
#include<string>
#include<conio.h>
#include "Employee.h"
using namespace std;
int Employee::employeeNo = 1000;
Employee::Employee() {
	individualEmpNo = ++employeeNo; //新输入员工编号:目前最大编号+1
	grade = 1;
}
Employee::~Employee() {
	delete name;
}
void Employee::pay() {

}
void Employee::displayStatus() {

}
void Employee::promote(int incre) {
	grade += incre;
}
void Employee::setName()
{
	char str[30];
	cout << "please input employee's name:";
	cin >> str;
	name = new char[strlen(str) + 1];
	strcpy_s(name, strlen(str) + 1, str);
}
Technician::Technician() {
	hourlyRate = 100; //每小时酬金1000元
}
void Technician::pay() {
	cout << "input " << name << " the workHours of this month:";
	cin >> workHours;
	accumPay = hourlyRate * workHours;
}
void Technician::displayStatus() {
	cout << "Technician:" << name << " No:" << individualEmpNo
		<<" grade:"<<grade
		<< " this month salary:" << accumPay << "\n";
}
Manager::Manager() {
	monthlyPay = 8000;//固定月薪8000
}
void Manager::pay() {
	accumPay = monthlyPay;
}
void Manager::displayStatus() {
	cout << "Manager:" << name << " No:" << individualEmpNo
		<< " grade:" << grade
		<< " this month salary:" << accumPay << "\n";

}
SalesMan::SalesMan() {
	CommRate = 0.05f;// 销售提成比例5%
}
void SalesMan::pay() {
	cout << "input " << name << " the sales of this month:";
	cin >> sales;
	accumPay = sales * CommRate;
}
void SalesMan::displayStatus() {
	cout << "SalesMan:" << name << " No:" << individualEmpNo
		<< " grade:" << grade
		<< " this month salary:" << accumPay << "\n";

}
SalesManager::SalesManager() {
	monthlyPay = 5000;
	CommRate = 0.005f;
}
void SalesManager::pay() {
	cout << "input" << Employee::name
		<< " the total sales of the department of this month:";
	cin >> sales;
	Employee::accumPay = monthlyPay + CommRate * sales;
}
void SalesManager::displayStatus() {
	cout << "SalesManager:" << Employee::name << " No:" << Employee::individualEmpNo
		<< " grade:" << Employee::grade
		<< " this month salary:" << Employee::accumPay << "\n";
}

Test.cpp

#include <iostream>
#include "Employee.h"
int main() {
	Manager m1;
	Technician t1;
	m1.setName();
	m1.promote(3);
	m1.pay();
	m1.displayStatus();
	t1.setName();
	t1.promote(2);
	t1.pay();
	t1.displayStatus();
	return 0;
}

在这里插入图片描述

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 首先,我们需要确定该信息管理系统需要管理哪些信息,例如员工信息、部门信息、薪资信息等等。接着,我们可以设计一个虚基类 `Employee`,来包含员工的共同属性和方法,例如姓名、工号、工资等等。 ```cpp class Employee { public: virtual ~Employee() {} virtual std::string getName() const = 0; virtual int getId() const = 0; virtual double getSalary() const = 0; virtual void display() const = 0; }; ``` 接下来,我们可以定义一些派生类,例如 `Manager`、`Engineer`、`Salesman`,来表示不同类型的员工,并实现虚基类 `Employee` 中的纯虚函数。 ```cpp class Manager : public virtual Employee { public: Manager(const std::string& name, int id, double salary, std::string department) : name_(name), id_(id), salary_(salary), department_(department) {} std::string getName() const override { return name_; } int getId() const override { return id_; } double getSalary() const override { return salary_; } std::string getDepartment() const { return department_; } void display() const override { std::cout << "Manager: " << getName() << ", ID: " << getId() << ", Department: " << getDepartment() << ", Salary: " << getSalary() << std::endl; } private: std::string name_; int id_; double salary_; std::string department_; }; class Engineer : public virtual Employee { public: Engineer(const std::string& name, int id, double salary, std::string project) : name_(name), id_(id), salary_(salary), project_(project) {} std::string getName() const override { return name_; } int getId() const override { return id_; } double getSalary() const override { return salary_; } std::string getProject() const { return project_; } void display() const override { std::cout << "Engineer: " << getName() << ", ID: " << getId() << ", Project: " << getProject() << ", Salary: " << getSalary() << std::endl; } private: std::string name_; int id_; double salary_; std::string project_; }; class Salesman : public virtual Employee { public: Salesman(const std::string& name, int id, double salary, double commission) : name_(name), id_(id), salary_(salary), commission_(commission) {} std::string getName() const override { return name_; } int getId() const override { return id_; } double getSalary() const override { return salary_ + commission_; } double getCommission() const { return commission_; } void display() const override { std::cout << "Salesman: " << getName() << ", ID: " << getId() << ", Commission: " << getCommission() << ", Salary: " << getSalary() << std::endl; } private: std::string name_; int id_; double salary_; double commission_; }; ``` 接下来,我们可以设计一个管理类 `Company`,来管理公司的信息。例如,我们可以使用 `std::vector` 来存储所有员工,并提供添加、删除、查询员工等操作。注意,我们需要使用虚继承,来避免多次继承 `Employee` 导致的二义性问题。 ```cpp class Company { public: void addEmployee(Employee* employee) { employees_.push_back(employee); } void removeEmployee(int id) { for (auto it = employees_.begin(); it != employees_.end(); ++it) { if ((*it)->getId() == id) { employees_.erase(it); break; } } } Employee* findEmployee(int id) const { for (auto employee : employees_) { if (employee->getId() == id) { return employee; } } return nullptr; } void displayAll() const { for (auto employee : employees_) { employee->display(); } } private: std::vector<Employee*> employees_; }; ``` 最后,我们可以在 `main` 函数中创建一些员工,并添加到公司信息管理系统中。 ```cpp int main() { Company company; Employee* manager = new Manager("Alice", 1001, 10000.0, "HR"); Employee* engineer = new Engineer("Bob", 1002, 8000.0, "Project A"); Employee* salesman = new Salesman("Charlie", 1003, 5000.0, 2000.0); company.addEmployee(manager); company.addEmployee(engineer); company.addEmployee(salesman); company.displayAll(); company.removeEmployee(1002); Employee* employee = company.findEmployee(1001); if (employee) { std::cout << "Found employee: " << employee->getName() << std::endl; } else { std::cout << "Employee not found" << std::endl; } return 0; } ``` 这样,我们就实现了一个简单的小型公司信息管理系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值