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