主函数
salary.cpp
#include <iostream>
#include <assert.h>
#include <iomanip>
#include "Employ.h"
#include "Manager.h"
#include "CommissionWorker.h"
#include "HourlyWorker.h"
#include "PieceWorker.h"
using namespace std;
int mainvoid)
{
cout.precision2);
cout.setfios::fixed);
Employee *ptr; //基类指针
Manager m"张", "奇", 800.00);
ptr = &m;
ptr->print); //动态连编
cout << "的工资是:" << ptr->earnings) << "元"; //动态连编
m.print); //静态连编
cout << "的工资是:" << m.earnings) << "元" << endl;//静态连编
CommissionWorker c"张", "明", 200.0, 3.0, 150);
ptr = &c;
ptr->print); //动态连编
cout << "的工资是:" << ptr->earnings) << "元"; //动态连编
c.print); //静态连编
cout << "的工资是:" << c.earnings) << "元" << endl;//静态连编
HourlyWorker h"周", "玲", 20.0, 40);
ptr = &h;
ptr->print); //动态连编
cout << "的工资是:" << ptr->earnings) << "元"; //动态连编
c.print); //静态连编
cout << "的工资是:" << c.earnings) << "元" << endl;//静态连编
PieceWorker p"孔", "杰", 5, 300);
ptr = &p;
ptr->print); //动态连编
cout << "的工资是:" << ptr->earnings) << "元"; //动态连编
p.print);
cout << "的工资是:" << c.earnings) << "元"; //静态连编
return 0;
}
所有工作人员公用的数据与函数
Employ.h
#ifndef employ_h
#define employ_h
//抽象基类Employee
class Employee
{
public:
//默认构造函数
Employeeconst char *first=" ", const char *last = " ");
~Employee); //析构函数
const char *getFirstName) const; //读取并返回姓
const char *getLastName) const; //读取并返回名
//纯虚函数使类Employee成为抽象基类
virtual float earnings) const = 0; //纯虚函数
virtual void print) const = 0; //纯虚函数
private:
char *firstName; //姓
char *lastName; //名
};
#endif
Employ.cpp
#include <iostream>
#include <assert.h>
#include <string.h>
#include "Employ.h"
using namespace std;
//注:纯虚函数没有定义
//构造函数动态为姓和名分配内存,并用函数strcpy把姓和名拷贝到对象中
/*
assert的作用是现计算表达式 expression ,如果其值为假(即为0),
那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行
*/
Employee::Employeeconst char *first, const char *last)
{
firstName = new char[strlenfirst) + 1];
assertfirstName != 0); //测试内存分配是否成功
strcpyfirstName, first);
lastName = new char[strlenlast) + 1];
assertlastName != 0); //测试内存分配是否成功
strcpylastName, last);
}
//析构函数释放动态分配的内存
Employee::~Employee)
{
delete []firstName;
delete []lastName;
}
//返回指向雇员姓的指针
const char *Employee::getFirstName) const
{
return firstName; //调用者必须自己释放内存
}
//返回指向雇员名的指针
const char *Employee::getLastName) const
{
return lastName; //调用者必须自己释放内存
}
经理的对象
Manager.h
#ifndef manager_h
#define manager_h
class Manager : public Employee
{
public:
Managerconst char*, const char*, float = 0.0);
void setWeeklySalaryfloat);
virtual float earnings) const;
virtual void print) const;
private:
float weeklySalary; //每周固定薪水
};
#endif
Manager.cpp
#include <iostream>
#include <assert.h>
#include "employ.h"
#include "Manager.h"
using namespace std;
//类Manager的构造函数
Manager::Managerconst char *first, const char *last, float s)
: Employeefirst, last)
{
weeklySalary = s;
}
//设置经理的固定月薪
void Manager::setWeeklySalaryfloat s)
{
weeklySalary = s;
}
//返回经理的薪水
float Manager::earnings) const
{
return weeklySalary;
}
//打印经理的信息
void Manager::print) const
{
cout << "\n经理:" << getFirstName) << ' ' << getLastName);
}
合同工对象
CommissionWorker.h
#ifndef commisworker_h
#define commisworker_h
#include "Employ.h"
class CommissionWorker : public Employee
{
public :
CommissionWorkerconst char*, const char*, float = 0.0, float = 0.0, int = 0);
void setSalaryfloat); //设置基本工资
void setCommissionfloat); //设置每件产品的回扣额
void setQuantityint); //设置每一周的销售额
virtual float earnings) const; //计算雇员的薪水
virtual void print) const; //打印雇员的基本信息
private:
float salary; //基本工资
float commission; //每年产品的回扣额
int quantity; //一周的销售额
};
#endif
CommissionWorker.cpp
#include <iostream>
#include "assert.h"
#include "CommissionWorker.h"
using namespace std;
//类CommissionWorker的构造函数
CommissionWorker::CommissionWorkerconst char *first, const char *last, float s, float c, int q)
: Employeefirst, last) //调用基类的构造函数
{
salary = s;
commission = c > 0 ? c : 0;
quantity = q > 0 ? q : 0;
}
//设置销售员每周的基本工资
void CommissionWorker::setSalaryfloat s)
{
salary = s > 0 ? s : 0;
}
//设置每件产品的回扣额
void CommissionWorker::setCommissionfloat c)
{
commission = c > 0 ? c : 0;
}
//计算雇员CommissionWorker的薪水
float CommissionWorker::earnings) const
{
return salary + commission * quantity;
}
//打印雇员CommissionWorker的信息
void CommissionWorker::print) const
{
cout << "\n合同工:" << getFirstName) << ' ' << getLastName);
}
计时工对象
HourlyWorker.h
#ifndef hourlyworker_h
#define hourlyworker_h
#include "Employ.h"
class HourlyWorker : public Employee
{
public:
HourlyWorkerconst char*, const char*, float = 0.0, float = 0.0);
void setWagefloat);
void setHoursfloat);
virtual float earnings) const;
virtual void print) const;
private:
float wage; //每小时的报酬
float hours; //一周工作小时数
};
#endif
HourlyWorker.cpp
#include <iostream>
#include <assert.h>
#include "HourlyWorker.h"
using namespace std;
//类HourlyWorker的构造函数
HourlyWorker::HourlyWorkerconst char *first, const char *last, float w, float h)
: Employeefirst, last) //调用基类的构造函数
{
wage = w > 0 ? w : 0;
hours = h > 0 && h < 168 ? h : 0;
}
// 设置每小时的报酬
void HourlyWorker::setWagefloat w)
{
wage = w;
}
//设置每周工作的小时数
void HourlyWorker::setHoursfloat h)
{
hours = h > 0 && h < 168 ? h : 0;
}
//计算并返回HourlyWorker的薪水
float HourlyWorker::earnings) const
{
return wage * hours;
}
//打印HourlyWorker的信息
void HourlyWorker::print) const
{
cout << "\n小时工:" << getFirstName) << ' ' << getLastName);
}
计件工对象
PieceWorker.h
#ifndef pieceworker_h
#define pieceworker_h
#include "Employ.h"
class PieceWorker : public Employee
{
public:
PieceWorkerconst char*, const char*, float w, int q);
void setWagefloat);
void setQuantityint);
virtual float earnings) const;
virtual void print) const;
private:
float wagePerPiece; //没见产品的报酬
int quantity; //一周生产的产品数量
};
#endif
PieceWorker.cpp
#include <iostream>
#include <assert.h>
#include "PieceWorker.h"
using namespace std;
//类PieceWorker的构造函数
PieceWorker::PieceWorkerconst char *first, const char *last, float w, int q)
: Employeefirst, last) //调用基类的构造函数
{
wagePerPiece = w > 0 ? w : 0;
quantity = q > 0 ? q : 0;
}
//设置没见产品的回扣额
void PieceWorker::setWagefloat w)
{
wagePerPiece = w > 0 ? w : 0;
}
//设置每周的销售量
void PieceWorker::setQuantityint q)
{
quantity = q > 0 ? q : 0;
}
//计算并返回PieceWorker每周的薪水
float PieceWorker::earnings) const
{
return wagePerPiece * quantity;
}
//打印PieceWorker的信息
void PieceWorker::print) const
{
cout << "\n计件工:" << getFirstName) << ' ' << getLastName);
}