//公司有四种职位 经理(Manager) 技术人员(Technician) 销售(SaleMan) 销售经理(SaleManager)
//每增加一个人,工号加1
//薪资:经理 8000 技术人员 300/天 销售 总额*4% 销售经理 部门销售额*2%+4000
在代码中,由于代码较多,采取分文件写的方式,首先申明头文件。 写了一个名为“company.h”的头文件,将基类以及派生类的一些函数进行定义申明。
#ifndef _COMPANY_H
#define _COMPANY_H
#include<string.h>
#include<iostream>
using namespace std;
class Company
{
protected:
static int number;
string m_name;
int m_id;
double m_salary;
public:
Company();
virtual double GetSalary()=0;
virtual void show()=0;
};
class Manager : virtual public Company
{
protected:
double m_base;
public:
Manager(string n,double b);
double GetSalary();
void show();
};
class Technician : public Company
{
protected:
int m_day;
public:
Technician(string n,int day);
double GetSalary();
void show();
};
class SaleMan : virtual public Company
{
protected:
double m_sale;
public:
static double sum_sale;
SaleMan(string n,double s);
double GetSalary();
void show();
};
class SaleManager : public SaleMan,public Manager
{
public:
SaleManager(string n);
double GetSalary();
void show();
};
#endif
接下来,我们将头文件内所有的函数进行实现,获取所有不同职员的基本信息以及他们的工资报酬。从以下的代码中可以看出,我们按照题目要求,对于不同的职员不同的工资进行了函数的实现以及获取。
#include<iostream>
#include"company.h"
using namespace std;
int Company::number=0;
double SaleMan::sum_sale=0;
Company::Company()
{
number++;
m_id=number;
}
Manager::Manager(string n,double b=8000)
{
m_name=n;
m_base=b;
}
double Manager::GetSalary()
{
m_salary=m_base;
return m_base;
}
void Manager::show()
{
cout << "姓名 :" << m_name << " 工号 :" << m_id << " 工资 :" << GetSalary() << endl;
}
Technician::Technician(string n,int day)
{
m_name=n;
m_day=day;
}
double Technician::GetSalary()
{
m_salary=300*m_day;
return m_salary;
}
void Technician::show()
{
cout << "姓名 :" << m_name << " 工号 :" << m_id << " 工资 :" << GetSalary() << endl;
}
SaleMan::SaleMan(string n,double s=0)
{
m_name=n;
m_sale=s;
sum_sale+=m_sale;
}
double SaleMan::GetSalary()
{
m_salary=m_sale*0.04;
return m_salary;
}
void SaleMan::show()
{
cout << "姓名 :" << m_name << " 工号 :" << m_id << " 工资 :" << GetSalary() << endl;
}
SaleManager::SaleManager(string n):SaleMan(n),Manager(n,4000)
{
}
double SaleManager::GetSalary()
{
m_salary = m_base + sum_sale * 0.02;
return m_salary;
}
void SaleManager::show()
{
cout << "姓名 :" << m_name << " 工号 :" << m_id << " 工资 :" << GetSalary() << endl;
}
通过main函数,实现对上述代码正确性与否的检测。将所有职员的基本信息以及获得的报酬打印出来,在这里采取随机数的方法,有些结果可能不符合实际情况。
#include<iostream>
#include"company.h"
using namespace std;
int main()
{
srand(time(NULL));
char name[20]={0};
Company *pt[5] = {0};
Company *ps[10] = {0};
Company *psm = NULL;
Company *pm = new Manager("aa", 8000);
pm->show();
for (int i = 0; i < 5; i++)
{
sprintf(name, "Technician%d", i);
pt[i] = new Technician(name, rand() % 22 + 1);
pt[i]->show();
}
for (int i = 0; i < 10; i++)
{
sprintf(name, "S%d", i);
ps[i] = new SaleMan(name, rand() % 200000);
ps[i]->show();
}
psm = new SaleManager("bb");
psm->show();
return 0;
}