第17讲抽象类 教学目的与要求: 了解抽象类的综合程序设计 掌握纯虚函数和抽象类。 教学内容提要: 纯虚函数; 2、抽象类; 3、综合举例; 教学重点:纯虚函数与抽象类的声明和使用。 教学难点:纯虚函数与抽象类的声明和使用。 教学进度:P210~P217 教学过程:
第17讲 抽象类 •教学目的与要求: 了解抽象类的综合程序设计。 掌握纯虚函数和抽象类。 •教学内容提要: 1、 纯虚函数; 2、抽象类; 3、综合举例; •教学重点:纯虚函数与抽象类的声明和使用。 •教学难点:纯虚函数与抽象类的声明和使用。 •教学进度:P210~P217 •教学过程:
171纯虚函数 1、纯虚函数是一个在基类中说明的虚函数,它在该基类中没有 定义具体的操作内容,要求各派生类根据实际需要定义自己 的版本。 2、纯虚函数的声明格式为: virtual函数类型函数名(参数表)=0; 注意: (1)、声明为纯虚函数之后,基类中就不再给出函数的实现部 分。 (2)、纯虚函数的函数体由派生类给出。 (3)、在C++中,还有一种情况是空的虚函数,空的虚函数是 指函数体为空的虚函数,请注意它和纯虚函数的区别。纯虚 函数根本就没有函数体,而空的虚函数的函数体为空(如: {}),前者所在的类是抽象类,不能直接进行实例化(不能 定义对象),而后者所在的类是可以实例化的
17.1 纯虚函数 1、纯虚函数是一个在基类中说明的虚函数,它在该基类中没有 定义具体的操作内容,要求各派生类根据实际需要定义自己 的版本。 2、纯虚函数的声明格式为: virtual 函数类型 函数名(参数表)=0; 注意: (1)、声明为纯虚函数之后,基类中就不再给出函数的实现部 分。 (2)、纯虚函数的函数体由派生类给出。 (3)、在C++中,还有一种情况是空的虚函数,空的虚函数是 指函数体为空的虚函数,请注意它和纯虚函数的区别。纯虚 函数根本就没有函数体,而空的虚函数的函数体为空(如: { }),前者所在的类是抽象类,不能直接进行实例化(不能 定义对象),而后者所在的类是可以实例化的
例17纯虚函数的使用。 #include class circle i public void setr(int xr=x; virtual void showo=0;∥纯虚函数 protected int re class Area: public Circlet public void showoi cout<<Area is"<<3.14 r*r<<endl; ∥重定义虚函数shw( class perimeter: public circle public void showoicout<<Perimeter is<<2*3.14*r<<endl; ∥重定义虚函数show(
例17.1纯虚函数的使用。 #include class Circle { public: void setr(int x){ r=x; } virtual void show()=0; // 纯虚函数 protected: int r; }; class Area:public Circle{ public: void show(){ cout<<"Area is "<<3.14*r*r<<endl;} }; // 重定义虚函数show() class Perimeter:public Circle{ public: void show(){cout<<"Perimeter is "<<2*3.14*r<<endl;} }; // 重定义虚函数show( )
void maino Circle *ptrs Area obl Perimeter ob2 obl. setr(10) ob2 setr(10); ptr=&obl; ptr->show 0; ptr=&ob2 ptr->showO
void main() { Circle *ptr; Area ob1; Perimeter ob2; ob1.setr(10); ob2.setr(10); ptr=&ob1; ptr->show(); ptr=&ob2; ptr->show(); }
172抽象类 抽象类是一种特殊的类,它为一族类提供统一的操作界 面 1、抽象类:带有纯虚函数的类 2、抽象类的特征: (1)、抽象类不能实例化,即不能定义一个抽象类的对象主 要作用是通过它为一个类族建立一个公共的接口,使它们 能够更有效地发挥多态特征。而接口的完整实现(即纯虚函 数的函数体),要由派生类自己给出。 (2)、抽象类派生出新的类之后,如果派生类给出所有纯虚 函数的函数实现,这个派生类就可以定义自己的对象,因 而不再是抽象类;反之,如果派生类没有给出全部纯虚函 数的实现,还继承了部分纯虚函数,这时的派生类仍然是 个抽象类
17.2 抽象类 抽象类是一种特殊的类,它为一族类提供统一的操作界 面。 1、抽象类:带有纯虚函数的类 2、抽象类的特征: (1)、抽象类不能实例化,即不能定义一个抽象类的对象主 要作用是通过它为一个类族建立一个公共的接口,使它们 能够更有效地发挥多态特征。而接口的完整实现(即纯虚函 数的函数体),要由派生类自己给出。 (2)、抽象类派生出新的类之后,如果派生类给出所有纯虚 函数的函数实现,这个派生类就可以定义自己的对象,因 而不再是抽象类;反之,如果派生类没有给出全部纯虚函 数的实现,还继承了部分纯虚函数,这时的派生类仍然是 一个抽象类
例172分析下列程序的运行结果 include“ iostream. h” class bo i public virtual void display()=0 class B1: public BO p ublic virtual void display) {cout<<”Bl: dislay()”<≤endl
例17.2分析下列程序的运行结果
class D1: public B1 void maino) i public {B0*p, virtual void display() B1b1; D1 d1 i coutdisplay(); 3 fun(p)
例173定义一个 shape抽象类,在此基础上派生出 rectangle类 和 circle类,二者都有 getarea(函数计算对象的面积, getperim()函数计算对象的周长 #include iostream h" class circle public shape class shape i public i public circle(float r)i radius=, 1 shape( 3 wcircleoix float getareao) wshape([3 I return 3. 14159*radius*radius, 1 virtual float getarea(0 float getperim( virtual float getperim(F0 i return 2*3. 14159*radi private float radius
例17.3 定义一个shape抽象类,在此基础上派生出rectangle类 和circle类,二者都有getarea( )函数计算对象的面积, getperim( )函数计算对象的周长
class rectangle public shape float length, width i public rectangle(float 1, float w) void maint i length= i shape *sp width=w sp=new circle() coutgetarea()getperim()getarea()getperim()<<endl delete sp
17.3综合实例】 现假设某高校按如下方式确定教师工资:对于在某一学科取得突出成 就的学术带头人聘为特聘教授,给予每月1000元的津贴;对于其他有突 出贡献的教学科研骨干聘为责任教授,给予每月5000元的津贴。普通教学 和科研人员则从其教学课时和科研经费中获得补助。特聘教授和责任教授 原工资待遇不变。 根据上述要求,可以声明基类为教师( Teacher),该基类包含一些所有教师 共有的数据比如教师的姓名、级别、编号、月工资;该基类的成员函数中 计算工资、显示教师的基本信息可以考虑声明为纯虚函数,因为对于抽象 的教师类来说,这些成员函数不具有实际意义。 注 该程序的类图如图所示 综合实例程序如下:
现假设某高校按如下方式确定教师工资:对于在某一学科取得突出成 就的学术带头人聘为特聘教授,给予每月10000元的津贴;对于其他有突 出贡献的教学科研骨干聘为责任教授,给予每月5000元的津贴。普通教学 和科研人员则从其教学课时和科研经费中获得补助。特聘教授和责任教授 原工资待遇不变。 该程序的类图如图所示 综合实例程序如下: 注 根据上述要求,可以声明基类为教师(Teacher),该基类包含一些所有教师 共有的数据比如教师的姓名、级别、编号、月工资;该基类的成员函数中 计算工资、显示教师的基本信息可以考虑声明为纯虚函数,因为对于抽象 的教师类来说,这些成员函数不具有实际意义。 【 17.3 综合实例】