【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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_48180029/article/details/112846218
今日推荐