C++-经典题目雇员问题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

本节,我们以一个小型公司的人员信息管理为例,说明类的派生过程及虚函数和虚基类的应用。1.问题的提出某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水.计算月薪总额并显示全部信息。人员编号基数为1000,每输入一个人员信息编号顺序加1。程序要有对所有人员提升级别的功能。本例中为简单起见,所有人员的初始级别均为1级。然后进行升级,经理升为4级,兼职技术人员和销售经理升为3级,推销员仍为1级。月薪计算办法是:经理拿固定月薪8000元;兼职技术人员按每小时100元领取月薪;兼职推销员的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%。2.类设计根据上述需求,设计一个基类employee,然后派生出technician(兼职技术人员)类、manager(经理)类和salesman(兼职推销员)类。由于销售经理既是经理又是销售人员,兼具两类人员的特点,因此同时继承manager和salesman两个类。在基类中,除了定义构造函数和析构函数以外,还应统一定义对各类人员信息应有的操作,这样可以规范类族中各派生类的基本行为。但是各类人员的月薪计算方法不同,不能在基类employee中统一确定计算方法。各类人员信息的显示内容也不同,同样不能在基类employee中统一确定显示方法。在基类employee中将pay()和displayStatus()设计为纯虚函数。这样,在主函数中变可以依据赋值兼容规则用基类employee类型的指针数组来处理不同派生类的对象,这是因为当用基类类型的指针调用虚函数时,系统会执行指针所指的对象的成员函数。由于本例的问题比较简单,因此对于类图中各类属性的详细说明请参看源程序注释。由于salesmanager类的两个基类又有公共基类employee,为了避免二义性,这里将employee设计为虚基类。//employee.hclassemployee{protected:char*name;//姓名intindividualEmpNo;//个人编号intgrade;//级别floataccumPay;//月薪总额staticintemployeeNo;//本公司职员编号目前最大值public:employee();//构造函数~employee();//析构函数virtualvoidpay()=0;//计算月薪函数(纯虚函数)virtualvoidpromote(intincrement二0);//升级函数(虚函数)virtualvoiddisplayStatus()=0;//显示人员信息(纯虚函数)};classtechnician:publicemployee//兼职技术人员类{private:floathourlyRate;//每小时酬金intworkHours;//当月工作时数public:technician();//构造函数voidpromote(int);//升级函数voidpay();//计算月薪函数voiddisplayStatus();//显示人员信息};classsalesman:virtualpublicemployee//兼职推销员类{protected:floatCommRate;//按销售额提取酬金的百分比floatsales://当月销售额public:salesman();//构造函数voidpromote(int);//升级函数voidpay();//计算月薪函数voiddisplayStatus();//显示人员信息};classmanager:virtualpublicemployee//经理类{protected:floatmonthlyPay;//固定月薪数public:manager();//构造函数voidpromote(int);//升级函数voidpay();//计算月薪函数voiddisplayStatus();//显示。人员信息};classsalesmanager:publicmanager,publicsalesman//销售经理类{public:salesmanager();//构造函数voidpromote(int);//升级函数‘voidpay();//计算月薪函数voiddisplayStatus();//显示人员信息};//empfunc.cpp#includeiostream.h#includestring.h#include”employee.h”intemployee::employeeNo=1000;//员工编号基数为1000employee::employee(){charnamestr[50];//输人雇员姓名时首先临时存放在namestr中cout”请输入下一个雇员的姓名:”;cinnamestr;name=newchar[strlen(namestr)+1];//动态申请用于存放姓名的内存空间strcpy(name,namestr);//将临时存放的姓名复制到nameindividualEmpNo=emptoyeeNo++;//新输入的员工,其编号为目前最大编号加lgrade=1;//级别初值为laccumPay=0.0;//月薪总额初值为0}employee::~employee(){deletename;//在析构函数中删除为存放姓名动态分配的内存空间}voidemployee::promote(intincrement){grade+=increment;//升级,提升的级数由increment指定}techniCian::technician(){hourlyRate=100;//每小时酬金100元}voidtechniCian::promote(int){employee::promote(2);//调用基类的升级函数,升2级}voidtechnician::pay(){cout”请输入”name”本月的工作时数:”;cinworkHours;accumPay=hourlyRate*workHours;//计算月薪,按小时计酬cout”兼职技术人员”name”编号”individualEmpNo”本月工资”accumPayendl;}voidtechnician::displayStatus(){cout”兼职技术人员”name”编号”individualEmpNo”级别为”grade”级,已付本月工资”accumPayendl;}salesman::salesman(){CommRate=0.04;//销售提成比例4%}voidsalesman::promote(int){employee::promote(0);//调用基类的升级函数,升0级}voidsalseman::pay(){cout”请输人”name”本月的销售额:”;cinsales;accumPay=sales*CommRate;//月薪二销售提成cout”推销员”name”编号”individualEmpNo”本月工资”accumPayendl;}voidsalesman::displaystatus(){cout”推销员”name”编号”individualEmpNo”级别为”grade”级,已付本月工资”accumPayendl;}manager::manager(){monthlyPay=8000;//固定月薪8000元}voidmanager::promote(int){employee::promote(3);//调用基类的升级函数,升3级}voidmanager::pay(){accumPay=monthlyPay;//月薪总额即固定月薪数cout经理name”编号”individualEmpNo”本月工资”accumPayendl;}voidmanager::displayStatus(){cout”经理”name”编号”individualEmpNo”级别为”grade”级,已付本月工资”accumPayendl;}salesmanager::salesmanager(){monthlyPay=5000;commRate=0.005;}voidsalesmanager::promote(int){employee::promote(2);//调用基类的升级函数,升2级}voidsalesmanager::pay(){cout”请输入”employee::name”所管辖部门本月的销售总额:;cinsales;accumPay=monthlyPay+CommRate*sales;//月薪二固定月薪+销售提成cout”销售经理”name”编号”individualEmpNo”本月工资”accumPayendl;}voidsalesmanager::displayStatus(){cout”销售经理”name”编号”individualEmpNo”级别为”grade”级,已付本月工资”accumPayendl;}//8—7.cpp#includeiostream。h#includeemployee.h”intmain(){managerm1;techniciant1;salesmanagersm1;salesmans1;employee*emp[4]={&m1,&tl,&sml,&s1};//用指针数组的各元素存放各对象的地址inti;for(i=0;i4;i++){/*依次调用各派生类对象的成员函数,完成各自不同的升级、计算月薪、显示信息功能。*/emp[i]—promote();emp[i]—pay();emp[i]—displayStatus();}returnO;}运行结果:请输入下一个雇员的姓名:zhang请输入下一个雇员的姓名:wang请输入下一个雇员的姓名:li请输入下一个雇员的姓名:zhao经理zhang编号1000本月工资8000经理zhang编号1000级别为4级,已付本月工资8000请输入wang本月的工作时数:40兼职技术人员wang编号1001本月工资4000兼职技术人员wang编号1001级别为3级,已付本月工资4000请输入li所管辖部门本月的销售总额:400000销售经理li编号1002本月工资7000销售经理li编号1002级别为3级,已付本月工资7000请输入zhao本月的销售额:40000推销员zhao编号1003本月工资1600推销员zhao编号1003级别为1级,已付本月工资1600在基类employee中使用虚函数。用基类类型的指针数组来处理不同派生类的对象时,通过访问的是派生类的成员函数,所以主函数中可以用循环结构,在循环体内用统一的形式调用不同派生类对象的成员函数来完成各自不同的升级、计算月薪、显示信息功能。本章小结结构化程序设计强调程序的功能,它以函数(一个功能单位)为中心,分层逐步展开程序设计。但是功能的大小界定,没有统一的标准,不同程序员的设计,反映了不同的思维、程序组织和风格,这给理解程序带来了阴影。同时,它不能隐藏数据复杂性,强迫主程序员必须懂业务、懂计算机以及具有深层次的知识背景。面向对象程序设计强调程序的分层分类概念,它以抽象为基础,轻灵地描述问题解决的大体思想,以此为基础,进行对象的定义与对象的展示,亦即程序设计,即高层次的抽象程序设计。与此相对应,进行“描述问题解决的大体思想”的具体实现,即类的内部实现(成员函数定义)。类定义是面向对象程序设计中的基础问题,对象定义是面向对象程序设计的一般

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功