欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C++_Chapter12.ppt

    • 资源ID:88512303       资源大小:180.50KB        全文页数:15页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C++_Chapter12.ppt

    第12章 多态性与虚函数n多态性(polymorphism)是面向对象程序设计的一个重要特征。n在C+程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。1n从系统实现的角度看,多态性分为两类:静态多态性和动态多态性。以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此静态多态性又称编译时的多态性。静态多态性是通过函数的重载实现的(运算符重载实质上也是函数重载)。动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数(virtual function)实现的。212.1 基类指针n派生类的一个重要特征是:派生类的指针和基类的指针兼容。n多态性就是巧妙地利用了这一简单但强大的多面特征。n下面我们重写上章的四边形和三角形的实例,但这里用指针兼容这一特征。3/pointers to base class#include using namespace std;class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;class CRectangle:public CPolygon public:int area()return(width*height);class CTriangle:public CPolygon public:int area()return(width*height/2);int main()CRectangle rect;/定义CRectangle类对象rect CTriangle trgl;/定义CTriangle类对象trgl CPolygon*ppoly1=▭/定义指针ppoly1,可以指向CPolygon类对象,指向子类对象rect CPolygon*ppoly2=&trgl;/定义指针ppoly2,可以指向CPolygon类对象,指向子类对象trgl ppoly1-set_values(4,5);ppoly2-set_values(4,5);cout rect.area()endl;cout trgl.area()endl;return 0;4n使用指针 ppoly1 和 ppoly2唯一的限制是,ppoly1和ppoly2是指向CPolygon类型,因此我们只能用这些指针指向继承自CPolygon类的CRectangle类和CTriangle类的成员。出于这个原因,当我们调用area()成员时,我们不得不直接使用对象rect and trgl而不能使用指针ppoly1和ppoly2。n为了类CPolygon的指针使用area()成员,area()应该不仅是其派生类的成员,也应是已声明为类CPolygon的成员,但问题是,CRectangle和CTriangle执行不同版本的area()函数,因此不能在基类中直接定义,但可以定义为一种虚拟成员。512.2 虚拟成员虚拟成员n虚拟成员。某类的成员可以在它的派生类中重新定义称为虚拟成员。为了声明一类的成员为虚拟的成员,只需在前面加上关键字virtual即可。n对以上的程序重写,在CPolygon类中添加一个虚拟成员 area()。n这样,三个类都用了相同的成员:width,height,set_values()and area()。6/virtual members#include using namespace std;class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int area()/声明虚拟函数area()return(0);class CRectangle:public CPolygon public:int area()return(width*height);class CTriangle:public CPolygon public:int area()return(width*height/2);int main()CPolygon poly;/定义CPolygon类对象poly CRectangle rect;/定义CRectangle类对象rect CTriangle trgl;/定义CTriangle类对象trgl CPolygon*ppoly1=▭/定义指针ppoly1,可以指向CPolygon类对象,指向子类对象rect CPolygon*ppoly2=&trgl;/定义指针ppoly2,可以指向CPolygon类对象,指向子类对象trgl CPolygon*ppoly3=&poly;/定义指针ppoly3,可以指向CPolygon类对象,指向基类对象poly ppoly1-set_values(4,5);ppoly2-set_values(4,5);ppoly3-set_values(4,5);cout area()endl;cout area()endl;cout area()endl;return 0;7n如果我们试图不用关键字virtual,那么会发现运行结果是三个0,而不是:20,10,0。n因为不用关键字virtual,三个指针的类型都是CPolygon*,都调用CPolygon:area(),而不是分别调用每个对象的相应area()函数(CRectangle:area(),CTriangle:area()and CPolygon:area())。n基类的指针指向子类对象,并且基类的成员和子类的成员同名,关键字virtual的作用就是让指针调用来自子类的对象成员时,具体地调用子类成员,而不是基类的成员。n一个类如果是含有虚拟成员函数的类,或继承自含有虚拟成员函数的类,称为多态类。n以上的含有虚拟成员函数的基类,可以定义对象(CPolygon poly;),也可以 调用来自他自己的成员函数(area(),值是0)。812.3 抽象基类n抽象基类和前面我们定义的基类非常类似,只是我们前面的基类的虚拟成员有效的函数,对定义自基类的对象(如对象poly 有一个基本的最小功能。而抽象基类定义的虚拟成员函数根本就不能执行,直接在函数后面写上等于0。class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int area()=0;9n注意,函数是直接让函数名等于0,而不定义任何执行语句,这样的函数称为纯虚拟函数,含有纯虚拟函数的基类我们称为抽象基类。n抽象基类和一般多态基类的区别是,因为抽象基类至少含有一个非执行性虚拟函数,抽象基类不能定义对象。n不能定义对象的抽象基类并不是完全无用的,我们可以定义指向抽象类的指针变量指向来自其子类的对象。10n上例中,对于抽象类,“CPolygon poly;”是错误的,但“CPolygon*ppoly1;CPolygon*ppoly2;”是正确的,ppoly1和ppoly2可以指向来自CPolygon子类的对象。n下面是完整的实例:11/abstract base class#include using namespace std;class CPolygon /抽象基类 protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int area(void)=0;/纯虚拟函数 ;class CRectangle:public CPolygon public:int area(void)return(width*height);class CTriangle:public CPolygon public:int area(void)return(width*height/2);int main()CRectangle rect;/定义子类的对象 CTriangle trgl;/定义子类的对象 CPolygon*ppoly1=▭/定义指向基类的指针,指向子类的对象 CPolygon*ppoly2=&trgl;/定义指向基类的指针,指向子类的对象 ppoly1-set_values(4,5);ppoly2-set_values(4,5);cout area()endl;cout area()endl;return 0;12n现在我们在基类CPolygon中定义一个用于将area()函数结果输出到显示器上的成员函数,尽管基类CPolygon的函数本身不会有任何执行。该例用到this指针。nthis指针。关键字this代表一个指针,该指针指向的对象的成员函数正在被调用。也就说this是隐含与每一个类的非静态成员函数中的特殊指针(包括构造函数和析构函数),它用于指向正在被成员函数操作的对象。他是指向当前对象的指针。n对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身。13/pure virtual members can be called/from the abstract base class#include using namespace std;class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int area(void)=0;void printarea(void)cout area()set_values(4,5);ppoly2-set_values(4,5);ppoly1-printarea();ppoly2-printarea();return 0;14/dynamic allocation and polymorphism下例是上面同样的例子,但对象是采用的动态创建:#include using namespace std;class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int area(void)=0;void printarea(void)cout area()set_values(4,5);ppoly2-set_values(4,5);ppoly1-printarea();ppoly2-printarea();delete ppoly1;delete ppoly2;return 0;15

    注意事项

    本文(C++_Chapter12.ppt)为本站会员(gsy****95)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开