【C++】【繼承】小型公司人員資訊管理
阿新 • • 發佈:2021-02-04
技術標籤:# C++大作業
需求和規格說明:
某小型公司,主要有四類人員:經理、技術人員、銷售經理和推銷員。要求儲存這些人員的姓名、編號、級別、當月薪水,計算月薪總額並顯示全部資訊。
人員編號基數為1000,每輸入一個人員的資訊,編號順序加1。
程式要對所有人員有提升級別的功能。為簡單起見,所有人員的初始級別均為1級,然後進行升級,經理升為4級,技術人員和銷售經理升為3級,推銷員仍為1級。
月薪計算辦法是:經理拿固定月薪8000元;技術人員按每小時100元領取月薪;推銷員的月薪按該推銷員當月銷售額的4%提成;銷售經理既拿固定月薪也領取銷售提成,固定月薪為5000元,銷售提成為所管轄部門當月銷售總額的5‰。
設計:
根據上述需求,設計一個基類employee,然後派生出technician(技術人員)類、manager(經理)類和salesman(推銷員)類。由於銷售經理(salesmanager)既是經理又是銷售人員,兼具兩類人員的特點,因此同時繼承manager和salesman兩個類。
在基類中,除了定義建構函式和解構函式以外,還應統一定義對各類人員資訊都應有的操作,這樣可以規範各派生類的基本行為。但是各類人員的月薪計算方法不同,不能在基類employee中統一定義計算方法。各類人員資訊的顯示內容也不同,同樣不能在基類中統一定義顯示方法。因此,在employee類中用純虛擬函式的方式定義了計算月薪函式pay()和顯示資訊函式displayStatus(),然後在派生類中再根據各自的同名函式實現具體的功能。
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;
}