面向对象编程:多态性.ppt_第1页
面向对象编程:多态性.ppt_第2页
面向对象编程:多态性.ppt_第3页
面向对象编程:多态性.ppt_第4页
面向对象编程:多态性.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象编程:多态性 提纲 n多态性概念 nvirtual函数(虚函数) n抽象类和纯虚函数 多态性概念 n多态性是面向对象程序设计的重要特征 之一。 n多态性是指发出同样的消息被不同类型 的对象接收时有可能导致完全不同的行 为。在C+程序设计中, n多态的实现: n函数重载 n运算符重载 n虚函数 在C+ 中有两 种多态 性 编译时的多态性 (静态多态性) 运行时的多 态性 (动态 多态性) 运行时的多态性是指在程序执行 前,无法根据函数名和参数来确 定该调用哪一个函数,必须在程 序执行过程中,根据执行的具体 情况来动态地确定。它是通过类 继承关系和虚函数来实现的。目的 也是建立一种通用的程序。通用性 是程序追求的主要目标之一。 通过函数的重载和运 算符的重载来实现的 。在程序编译时系统 就能决定调用的是哪 个函数。 多态性概念 类继承层次中对象之间的关系 n基类指针和派生类指针与基类对象和派 生类对象4种可能匹配: n 直接用基类指针引用基类对象; n 直接用派生类指针引用派生类对象; n 用派生类指针引用一个基类对象; n用基类指针引用一个派生类对象; #include using namespace std; class B0/基类B0声明 public:/外部接口 void display() /虚成员函数 coutdisplay(); int main()/主函数 B0 b0, *p;/声明基类对象和指针 B1 b1,*q; /声明派生类对象 D1 d1;/声明派生类对象 p= q= fun(q); fun(p);/调用基类B0函数成员 p= fun(p);/调用派生类B1函数成员 p= fun(p);/调用派生类D1函数成员 n若将派生类对象的地址赋给指向基类的指针, 则用该指针仅能访问派生类中从基类继承来的公 有成员,也就是说,通过指针引起的普通成员函数 调用,仅仅与指针的类型有关,而与指针正指向 什么对象无关。在这种情况下,必须采用显式的方式 调用派生类的函数成员。 n本来使用对象指针是为了表达一种动态 的性质,即当指针指向不同对象时执行 不同的操作,现在看来并没有起到这种 作用。要实现这种功能,就需要引入虚 函数的概念。 虚函数 虚函数是类中的一个用关键字 virtual 修饰的成 员函数。 virtual(形参表) 函数体 或者 virtual(形参表); n在类的声明中,在函数原型之前写virtual。 nvirtual 只用来说明类声明中的原型,不能用 在函数实现时。 一个函数一经说明为虚函数,则无论说明 它的类被继承了多少层,在每一层派生 类中该函数将永远保持其 virtual 特性。 当基类中的某个成员函数被声明为虚函数 后,此虚函数就可以在一个或多个派生 类中被重新定义,在派生类中重新定义 时,其函数原型,包括返回类型、函数 名、参数个数、参数类型以及参数的顺 序都必须与基类中的原型完全相同。 虚函数 n虚函数是动态绑定的基础。 n是非静态的成员函数。 n具有继承性,基类中声明了虚函数,派生类 中无论是否说明,同原型函数都自动为虚函 数。 n本质:不是重载声明而是覆盖。 虚函数 定义虚函数的目的是为了让派生类覆盖( Overriding)它。覆盖不同于重载,它要求 重新定义的函数在参数和返回值方面与原函 数完全相同。否则将属于重载(参数不同) 或导致一个编译错误(返回值类型不同)。 与函数重载相同,虚函数也体现了 OOP 技 术的多态性。 函数名返回值参数束定时间适用范围语义相关性 虚函数同同运行时派生类一组类似函数 重载函数可不同不同编译时任意可语义无关 虚函数和重载函数 l一组虚函数中,两个虚函数仅返回值不同,参数 和名字相同,编译错。 n调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函 数。 #include using namespace std; class B0/基类B0声明 public:/外部接口 virtual void display() /虚成员函数 coutdisplay(); int main()/主函数 B0 b0, *p;/声明基类对象和指针 B1 b1,*q; /声明派生类对象 D1 d1;/声明派生类对象 p= q= fun(q); fun(p);/调用基类B0函数成员 p= fun(p);/调用派生类B1函数成员 p= fun(p);/调用派生类D1函数成员 n上面的例题想运行结果为: n书例526-527 虚析构函数 何时需要虚析构函数? n当你可能通过基类指针删除派生类对象时 n如果你打算允许其他人通过基类指针调用对象的 析构函数(通过delete这样做是正常的),并且 被析构的对象是有重要的析构函数的派生类的对 象,就需要让基类的析构函数成为虚拟的。 虚析构函数的声明语法如下: virtual类名 #include Using namespace std; class A public: A() cout Using namespace std; class A public: virtual A() cout using namespace std; const double PI=3.14159; class Shapes/抽象基类Shapes声明 protected: int x,y; public: void setvalue(int xx,int yy=0)x=xx;y=yy; virtual void display()=0;/纯虚函数成员 ; class Rectangle:public Shapes /派生类Rectangle声明 public:/虚成员函数 vo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论