《C++第12章多态性与虚函数》由会员分享,可在线阅读,更多相关《C++第12章多态性与虚函数(61页珍藏版)》请在金锄头文库上搜索。
1、第12章 多态性与虚函数,本章主要内容,多态性一个典型的例子虚函数纯虚函数和抽象类,多态性的概念,多态性(polymorphism)是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。多态的实现:函数重载运算符重载虚函数 多态性是“一个接口,多种方法”。,静态多态性和动态多态性,多态性分为两类: 静态多态性和动态多态性。,在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数(virtual function)实现的。,函数重载和运算符重载实现的多态性。在程序编译时系统就能决定调用的是哪个函数,因此静态多
2、态性又称编译时的多态性。静态多态性是通过函数的重载实现的(运算符重载实质上也是函数重载)。,一个典型的例子,例12.1: 先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径)。再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。要求编写程序,重载运算符“”,使之能用于输出以上类对象。,解题思路:对于一个比较大的程序,应当分成若干步骤进行。先声明基类,Point类,Circle类,再声明派生类逐级进行,分步调试,Cylinder类,/声明类Pointclass Pointpubli
3、c: Point(float x=0,float y=0);/有默认参数的构造函数 void setPoint(float,float); /设置坐标值 float getX( ) const return x; /读x坐标 float getY( ) const return y; /读y坐标 friend ostream ,Point类,之成员函数,Point类,/设置x和y的坐标值void Point:setPoint(float a,float b) /为x,y赋新值 x=a; y=b;,/重载运算符“”,使之能输出点的坐标ostream ,/Point的构造函数Point:Point
4、(float a,float b) /对x,y初始化 x=a; y=b;,测试Point类程序,int main( )Point p(3.5,6.4);/建立Point类对象pcoutx=p.getX( ) ,y=p.getY( )endl;/输出p的坐标值 p.setPoint(8.5,6.8); /重新设置p的坐标值 coutp(new):pendl; /用重载运算符“”输出p点坐标return 0;,程序编译通过,运行结果为x=3.5,y=6.4p(new):8.5,6.8,测试程序检查了Point基类中各函数的功能,以及运算符重载的作用,证明程序是正确的。,/声明派生类Circlecl
5、ass Circle:public Point /circle是Point类的公用派生类public: Circle(float x=0,float y=0,float r=0); /构造函数 void setRadius(float); /设置半径值 float getRadius( ) const; /读取半径值 float area ( ) const; /计算圆面积 friend ostream ,Circle类,之成员函数,Circle类,/设置半径值void Circle:setRadius(float r) radius = r ; ,/重载运算符“”,使之按规定的形式输出圆的信
6、息ostream ,/定义构造函数,对圆心坐标和半径初始化Circle:Circle(float a,float b,float r):Point(a,b),radius(r) ,/读取半径值float Circle:getRadius( ) const return radius ; ,/计算圆面积float Circle:area( ) const return 3.14159*radius*radius ; ,测试Circle类程序,int main( )Circle c(3.5,6.4,5.2); /建立Circle类对象c,并给定圆心坐标和半径 coutoriginal circle
7、:nx=c.getX() , y=c.getY(), r=c.getRadius( ) , area=c.area( )endl; /输出圆心坐标、半径和面积 c.setRadius(7.5); /设置半径值 c.setPoint(5,5); /设置圆心坐标值x,y coutnew circle:nc; /用重载运算符“”输出圆对象的信息 Point ,程序编译通过,运行结果为:original circle: (输出原来的圆的数据)x=3.5, y=6.4, r=5.2, area=84.9486new circle: (输出修改后的圆的数据)Center=5,5, r=7.5, area=
8、176.714pRef:5,5 (输出圆的圆心“点”的数据),测试程序检查了Circle类中各函数的功能,以及运算符重载的作用,证明程序是正确的。,/声明派生类Cylinderclass Cylinder:public Circle/ Cylinder是Circle的公用派生类public: Cylinder (float x=0,float y=0,float r=0,float h=0);/构造函数 void setHeight(float); /设置圆柱高 float getHeight( ) const; /读取圆柱高 float area( ) const; /计算圆表面积 floa
9、t volume( ) const; /计算圆柱体积 friend ostream,Cylinder类,之成员函数,Cylinder类,/设置圆柱高void Cylinder:setHeight(float h)height=h;,/重载运算符“”ostream ,/定义构造函数,对圆心坐标半径和高初始化Cylinder:Cylinder(float a,float b,float r,float h) :Circle(a,b,r),height(h),/读取圆柱高float Cylinder:getHeight( ) const return height;,/计算圆表面积float Cyl
10、inder:area( ) const return 2*Circle:area( )+2*3.14159*radius*height; ,/计算圆柱体积float Cylinder:volume() const return circle:area()*height; ,测试Cylinder类程序,int main( )Cylinder cy1(3.5,6.4,5.2,10);/定义Cylinder类对象cy1 coutnoriginal cylinder:nx=cy1.getX( ), y=cy1.getY( ), r=cy1.getRadius( ), h=cy1.getHeight(
11、)n area=cy1.area() ,volume=cy1.volume()endl; /用系统定义的运算符“”输出cy1的数据 cy1.setHeight(15); /设置圆柱高 cy1.setRadius(7.5); /设置圆半径 cy1.setPoint(5,5); /设置圆心坐标值x,y coutnnew cylinder:ncy1; /用重载运算符“”输出cy1的数据 Point ,运行结果如下:original cylinder: (输出cy1的初始值)x=3.5, y=6.4, r=5.2, h=10 (圆心坐标x,y。半径r,高h)area=496.623, volume=8
12、49.486 (圆柱表面积area和体积volume)new cylinder: (输出cy1的新值)Center=5,5, r=7.5, h=15 (以5,5形式输出圆心坐标)area=1060.29, volume=2650.72 (圆柱表面积area和体积volume)pRef as a Point:5,5 (pRef作为一个“点”输出)cRef as a Circle: Center=5,5, r=7.5, area=176.714 (cRef作为一个“圆”输出),测试程序检查了Cylinder类中各函数的功能。在编译时编译系统可以判定应调用哪个重载运算符函数。,12.3 虚函数,首先
13、看一个例子_例12.2,基类与派生类中有同名函数,在此程序中-Student是基类,Graduate是派生类,它们都有display这个同名的函数。,/声明基类Studentclass Studentpublic: Student(int, string,float);/声明构造函数 void display( ); /声明输出函数protected: /受保护成员,派生类可以访问 int num; string name; float score; ;,/Student类成员函数的实现Student:Student(int n, string nam,float s) /定义构造函数 num=n;name=nam;score=s;,void Student:display( ) /定义输出函数coutnum:numn name:namenscore:scorenn;,