- 1、本文档共40页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第讲_多态性与虚函数().ppt
第12讲 多态性与虚函数 12.1 授课内容 多态性与虚函数。主要内容: 1.多态性的基本概念; 2.编译时的多态性和运行时的多态性的概念; 3.虚函数的概念、作用及应用; 4.虚析构函数的概念、作用及应用。??? 第12讲 多态性与虚函数 12.2 授课要求 1.理解编译时的多态性和运行时的多态性的概念; 2.掌握多态性的概念; 3.掌握虚函数的概念、作用及应用; 4.掌握虚析构函数的概念、作用及应用 。 第12讲 多态性与虚函数 12.3 授课重点 1.重点是多态性的概念和虚函数。 12.4 授课难点 1.难点是是虚函数。 1.多态性的概念 多态性(polymorphism)是面向对象程序设计的一个重要特征。利用多态性可以设计和实现一个易于扩展的系统。 在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。 在面向对象方法中一般是这样表述多态性的: 向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。 1.多态性的概念 多态性分为两类: 静态多态性和动态多态性。 函数重载和运算符重载实现的多态性属于静态多态性。在程序编译时系统就能决定调用的是哪个函数,因此静态多态性又称编译时的多态性。 动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。 1.多态性的概念 多态性是“一个接口,多种方法”。 在本讲中主要介绍动态多态性和虚函数。 问题: 当一个基类被继承为不同的派生类时,各派生类可以使用与基类成员相同的成员名,如果在运行时用同一个成员名调用类对象的成员,会调用哪个对象的成员? 2.一个典型的例子 例1(P199例6.1) 先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。要求编写程序,重载运算符“”和“”,使之能用于输出以上类对象。 该例是个比较大的程序,应当分成若干步骤进行。先声明基类,再声明派生类,逐级进行,分步调试。 (1) 声明基类Point类 可写出声明基类Point的部分如下: #include iostream.h //声明类Point class Point {public: 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 operator(ostream ,const Point ); //重载运算符“” protected: float x,y; }; //下面定义Point类的成员函数 Point::Point(float a,float b) //对x,y初始化 {x=a;y=b;} void Point::setPoint(float a,float b) //为x,y赋新值 {x=a;y=b;} //重载运算符“”,使之能输出点的坐标 ostream operator(ostream output,const Point p) {output″[″p.x″,″p.y″]″endl; return output; } //以上完成了基类Point类的声明。 int main( ) //测试程序。 { Point p(3.5,6.4);//建立Point类对象p coutx=p.getX( ),y= p.getY( )endl; //输出p的坐标值 p.setPoint(8.5,6.8); //重新设置p的坐标值 coutp(new): p endl; //用重载运算符”输出p点坐标 } (2) 声明派生类Circle 在上面的基础上,再写出声明派生类Circle的部分: class Circle: public Point {public: Circle(float x=0,float y=0,float r=0); //构造函数 void setRadius(float); /
文档评论(0)