浙江理工大学信息学院实验报告书实验名称:类的多态性的实现学时安排:3实验类别:设计性实验实验要求:1人1组学号:2013339960039姓名:周剑 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄一、实验目的1.理解重载运算符的意义。2.掌握使用成员函数、友员函数重载运算符的特点。3.掌握重载运算符函数的调用方法。4.掌握动态联编的概念。5.掌握虚函数和纯虚函数的使用方法。二、实验原理介绍设计性实验具体原理请见实验内容和步骤实现对抽象类的继承,通过operator函数调用的形式,实现运算符的重载三、实验设备介绍软件需求:VisualC++6.0硬件需求:对于硬件方面的要求,建议配置是PentiumIII450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。四、实验内容某公司的员工有经理Manager、技术人员Technicist和营销人员SalsePerson,他们的薪金计算方法如下:经理按月计酬,方法是:基本工资+奖金;技术人员按月计酬,方法是:基本工资;营销人员按月计酬,方法是:基本工资+销售利润*5%。每类人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据,其中为入职时间定义Date类,并为该类重载运算符,实现入职时间的输入;各类人员使用统一接口getpay()计算各类人员的月薪。其次,设计一个统计并输出该公司每个人员某几个月薪金情况的报表类Report,该类提供add接口向Report类的容器中添加员工信息,并提供print接口用于输出每个员工的职工编号、姓名、性别、入职时间、职位和在设定的月份时间段中该员工的薪酬总额。为了方便实现查找功能,为Report类重载[]运算符的功能,下标值为职位,能根据职位信息查找出所有符合该职位的员工,并重载print接口,输出查找出的员工信息,信息包括职工编号、姓名、性别、入职时间、职位、基本工资。在主函数中对实现的类进行测试,首先,创建各类人员对象,通过Report类的add接口向报表中添加这些人员信息,然后通过Report类的print接口输出报表。其次测试报表的查找功能,输入要查找的员工职位信息,通过Report类的print接口输出查找到的员工基本信息报表。五.代码清单#includeiostream#includevector#includestringusingnamespacestd;classDate{public:inty,m,d;Date(intyy=0,intmm=0,intdd=0):y(yy),m(mm),d(dd){}friendistream&operator(istream&is,Date&p);friendostream&operator(ostream&os,Date&p);};classEmployee{protected:Datedate;stringemployee_number;stringemployee_name;stringemployee_gender;stringemployee_position;doubleemployee_basic_money;doubleprize[13];public:virtualdoublegetpay(intn)=0;Dateget_date(){returndate;}stringget_number(){returnemployee_number;}stringget_name(){returnemployee_name;}stringget_gender(){returnemployee_gender;}stringget_position(){returnemployee_position;}doubleget_basic_money(){returnemployee_basic_money;}virtualvoidput(Dated,stringe_num,stringe_name,stringe_g,stringe_p,doublee_m,doublemoney[13])=0;};classManager:publicEmployee{public:Manager(inta=0,intb=0,intc=0,doubled=-1){Datedate(a,b,c);employee_basic_money=d;for(inti=0;i13;i++)prize[i]=0;}voidput(Dated,stringe_num,stringe_name,stringe_g,stringe_p,doublee_m,doublemoney[13]);doublegetpay(intn);};classTechnicist:publicEmployee{public:Technicist(intp=-1,inta=0,intb=0,intc=0,intd=-1){Datedate(a,b,c);employee_basic_money=d;}voidput(Dated,stringe_num,stringe_name,stringe_g,stringe_p,doublee_m,doublemoney[13]);doublegetpay(intn);};classSalsePerson:publicEmployee{public:SalsePerson(inta=0,intb=0,intc=0,intd=-1){Datedate(a,b,c);for(inti=0;i13;i++)prize[i]=0;employee_basic_money=d;}voidput(Dated,stringe_num,stringe_name,stringe_g,stringe_p,doublee_m,doublemoney[13]);doublegetpay(intn);};classRepoter{private:vectorEmployee*v;vectorEmployee*::iteratorit;public:voidadd(Employee*p);voidprint(intn1,intn2);voidprint(intn);voidoperator[](stringpos);};#includeh1.histream&operator(istream&is,Date&p){isp.yp.mp.d;returnis;}ostream&operator(ostream&os,Date&p){osp.y/p.m/p.dendl;returnos;}voidManager::put(Dated,stringe_num,stringe_name,stringe_g,stringe_p,doublee_m,doublemoney[13]){coutM:putendl;date=d;employee_number=e_num;employee_name=e_name;employee_gender=e_g;employee_position=e_p;employee_basic_money=e_m;for(inti=1;i13;i++)prize[i]=money[i];}doubleManager::getpay(intn){if(employee_basic_money==-1||n12||n=0)return-1;returnemployee_basic_money+prize[n];}voidTechnicist::put(Dated,stringe_num,stringe_name,stringe_g,stringe_p,doublee_m,doublemoney[13]){coutT:putendl;date=d;employee_number=e_num;employee_name=e_name;employee_gender=e_g;employee_position=e_p;employee_basic_money=e_m;for(inti=1;i13;i++)prize[i]=money[i];}doubleTechnicist::getpay(intn){returnemployee_basic_money;}voidSalsePerson::put(Dated,stringe_num,stringe_name,stringe_g,stringe_p,doublee_m,doublemoney[13]){coutS:putendl;date=d;employee_number=e_num;employee_name=e_name;employee_gender=e_g;employee_position=e_p;employee_basic_money=e_m;for(inti=1;i13;i++)prize[i]=money[i];}doubleSalsePerson::getpay(intn){if(employee_basic_money==-1)return-1;returnemployee_basic_money+prize[n]*0.05;}voidRepoter::add(Employee*p){v.push_back(p);}voidRepoter::print(intn1,intn2){inti=0;for(it=v.begin();it!=v.end();it++,i++){coutv[i]-get_number()endl;coutv[i]-get_name()endl;coutv[i]-get_gender()endl;coutv[i]-get_date();coutv[i]-get_position()endl;doublesum=0;for(intj=n1;j=n2;j++){sum+=v[i]-getpay(j);}coutsumendl;}}voidRepoter::print(intn){coutv[n]-get_number()endl;coutv[n]-get_name()endl;coutv[n]-get_gender()endl;coutv[n]-get_date();coutv[n]-get_position()endl;coutv[n]-get_basic_money()endl;}voidRepoter::operator[](stringpos){inti=0;for(it=v.begin();it!=v.end();it++,i++){if(v[i]-get_position()==pos)print(i);coutendl;}}#includeh1.hintmain(){Datedd;stringnumber;stringname;stringgender;stringposition;doublebasic_money;doublemoney[13];Employee*p;Repoterre;//n为真时表示继续输入,为假时表示输入结束booln;//cnt用来记录总的人数intcnt=0;while(cinn&&n){//dd以年月日的形式输入cinddnumbernamegenderpositionbasic_money;for(inti=1;i13;i++)cinmoney[i];if(position==Manager)p=newManager;elseif(position==Technicist)p=newTechnicist;elsep=n