抽象类.ppt
《抽象类.ppt》由会员分享,可在线阅读,更多相关《抽象类.ppt(25页珍藏版)》请在冰豆网上搜索。
第17讲抽象类,教学目的与要求:
了解抽象类的综合程序设计。
掌握纯虚函数和抽象类。
教学内容提要:
1、纯虚函数;2、抽象类;3、综合举例;教学重点:
纯虚函数与抽象类的声明和使用。
教学难点:
纯虚函数与抽象类的声明和使用。
教学进度:
P210P217教学过程:
17.1纯虚函数,1、纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本。
2、纯虚函数的声明格式为:
virtual函数类型函数名(参数表)=0;注意:
(1)、声明为纯虚函数之后,基类中就不再给出函数的实现部分。
(2)、纯虚函数的函数体由派生类给出。
(3)、在C+中,还有一种情况是空的虚函数,空的虚函数是指函数体为空的虚函数,请注意它和纯虚函数的区别。
纯虚函数根本就没有函数体,而空的虚函数的函数体为空(如:
),前者所在的类是抽象类,不能直接进行实例化(不能定义对象),而后者所在的类是可以实例化的。
例17.1纯虚函数的使用。
#includeclassCirclepublic:
voidsetr(intx)r=x;virtualvoidshow()=0;/纯虚函数protected:
intr;classArea:
publicCirclepublic:
voidshow()coutAreais3.14*r*rendl;/重定义虚函数show()classPerimeter:
publicCirclepublic:
voidshow()coutPerimeteris2*3.14*rendl;/重定义虚函数show(),voidmain()Circle*ptr;Areaob1;Perimeterob2;ob1.setr(10);ob2.setr(10);ptr=,17.2抽象类,抽象类是一种特殊的类,它为一族类提供统一的操作界面。
1、抽象类:
带有纯虚函数的类2、抽象类的特征:
(1)、抽象类不能实例化,即不能定义一个抽象类的对象主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特征。
而接口的完整实现(即纯虚函数的函数体),要由派生类自己给出。
(2)、抽象类派生出新的类之后,如果派生类给出所有纯虚函数的函数实现,这个派生类就可以定义自己的对象,因而不再是抽象类;反之,如果派生类没有给出全部纯虚函数的实现,还继承了部分纯虚函数,这时的派生类仍然是一个抽象类。
例17.2分析下列程序的运行结果,例17.3定义一个shape抽象类,在此基础上派生出rectangle类和circle类,二者都有getarea()函数计算对象的面积,getperim()函数计算对象的周长。
该程序的类图如图所示综合实例程序如下:
【17.3综合实例】,图程序的类图,/EXAMPLE.H/类的声明#include#include#include#include#defineN10000typedefenumgradespecProf,respProf,norProf,resProfGRADE;/声明枚举类型,包括特聘教授、责任教授、教学人员和研究人员classTeacher/声明抽象基类protected:
intnNo;/编号char*cName;/姓名GRADEeGrade;/级别doubledblSalary;/工资staticintnCount;/教工总数,(续),public:
Teacher();Teacher();virtualvoidsetGrade(GRADEegrade=norProf):
eGrade(egrade)virtualvoidcalSalary()=0;/纯虚函数,计算工资总数virtualvoiddispMsg()=0;/纯虚函数,显示教工基本信息;classNorProf:
virtualpublicTeacher/声明教学人员派生类protected:
doubledblClassHour;/每月授课课时数doubledblHourPay;/每课时补助public:
NorProf();voidsetGrade(GRADE);voidcalSalary();voiddispMsg();,(续),classResProf:
virtualpublicTeacher/声明研究人员派生类protected:
doubledblResMoney;/每月承担的科研经费总数doubledblRateFromRes;/提成public:
ResProf();voidsetGrade(GRADE);voidcalSalary();voiddispMsg();classSpecProf:
publicNorProf,publicResProf/声明特聘教授派生类,该类从教学人员和研究人员派生private:
doubledblMonSalary;/特聘教授的每月固定津贴public:
SpecProf();voidsetGrade(GRADE);,(续),voidcalSalary();voiddispMsg();classRespProf:
publicNorProf,publicResProf/声明责任教授派生类,该类从教学人员和研究人员派生private:
doubledblMonSalary;/责任教授每月固定津贴public:
RespProf();voidsetGrade(GRADE);voidcalSalary();voiddispMsg();/EXAMPLE.CPP/类的实现#include#includeEXAMPLE.H,(续),intTeacher:
nCount=N;Teacher:
Teacher():
dblSalary(800.0),eGrade(norProf)charname30;coutname;cName=newcharstrlen(name)+1;strcpy(cName,name);nCount+;nNo=nCount;Teacher:
Teacher()deletecName;SpecProf:
SpecProf():
dblMonSalary(10000.0)dblHourPay=8.0;dblRateFromRes=0.01;,(续),voidSpecProf:
setGrade(GRADE)Teacher:
setGrade(specProf);voidSpecProf:
calSalary()coutdblClassHour;coutdblResMoney;coutendl;/特聘教授工资包括基本工资+津贴+课时补助+科研经费提成dblSalary=dblSalary+dblMonSalary+dblHourPay*dblClassHour+dblRateFromRes*dblResMoney;coutcNameisaspecialProf.HisSalaryis:
dblSalaryendl;,(续),voidSpecProf:
dispMsg()coutSpecialProf.cName,hisNo.is:
nNo,hisgradeis:
eGrade,hissalaryis:
dblSalaryendl;coutThisisthebasicmessageofcNameendl;RespProf:
RespProf():
dblMonSalary(5000.0)dblHourPay=8.0;dblRateFromRes=0.01;voidRespProf:
setGrade(GRADE)Teacher:
setGrade(respProf);voidRespProf:
calSalary()coutPleaseinputtheclasshoursofonemonthforcName;,(续),cindblClassHour;coutdblResMoney;coutendl;/责任教授工资包括基本工资+津贴+课时补助+科研经费提成dblSalary=dblSalary+dblMonSalary+dblHourPay*dblClassHour+dblRateFromRes*dblResMoney;coutcNameisaresponsibleProf.HisSalaryis:
dblSalaryendl;voidRespProf:
dispMsg()coutResponsibleProf.cName,hisNo.is:
nNo,hisgradeis:
eGrade,hissalaryis:
dblSalaryendl;coutThisisthebasicmessageofcNameendl;,(续),NorProf:
NorProf():
dblHourPay(8.0)voidNorProf:
setGrade(GRADE)Teacher:
setGrade(norProf);voidNorProf:
calSalary()coutdblClassHour;/教学人员工资为基本工资+课时补助dblSalary=dblSalary+dblClassHour*dblHourPay;coutcNameisanormalProfandhissalaryis:
dblSalaryendl;voidNorProf:
dispMsg(),(续),coutdblResMoney;/研究人员工资包括基本工资+科研经费提成dblSalary=dblSalary+dblRateFromRes*dblResMoney;,(续),cout#includeEXAMPLE.Hvoidmain()SpecProfteacher1;/声明特聘教授对象RespProfteacher2;/声明责任教授对象NorProfteacher3;/声明教学人员对象ResProfteacher4;/声明研究人员对象Teacher*ptrTeacher;/声明抽象基类的指针,(续),ptrTeacher=,(续),(续),小结1、什么是纯虚函数2、抽象类的特征及作用3、综合程序设计作业:
P256-258:
5.135.20,