C课件第7章多态性与虚函数_第1页
C课件第7章多态性与虚函数_第2页
C课件第7章多态性与虚函数_第3页
C课件第7章多态性与虚函数_第4页
C课件第7章多态性与虚函数_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、多冬俊彫虐矗敌本章内容:多态性概述:运算符重载 :虚函数:了解多态性的概念:掌握简单运算符重载的方法:掌握虚函数的定义和使用方法7. 1多态性概述1. 多态性的含义在C+中多态表现为同一形式的函数调用,可能调用不同的函数实现。2. 多态性的表现形式参数多态:函数模板和类模板包含多态:继承了虚函数的派生类同名函数重载多态:函数重载和运算符重载强制多态:强制类型转换1 运算符函数 C+将各种运算符都处理成一个特殊的函数调用。例:在程序中写:3+5系统处理成:operator+ (3, 5); C+中预定义的多数运算符函数其运算对象只能是基本数 据类型,而不适用于用户自定义类型(如类)2运算符重载对

2、C+的运算符函数进行重新定义,使之以同样的形式按重新定义的方式操作类的对象。1)2)3)4)7. 2运算符重载3. 运算符重载的规则只能重载C+ +中己有的运算符。IM不能重载的运算符:二、二*sizeof。重载运算符时不能改变原运算符操作数的个数、原有运算 符的优先级和结合性,也不能改变原运算符对于内部基本 类型对象的含义。C+ +内部已对所有对象重载了和实现的操作是:把“二右侧对象的数据成员赋给左侧对象的对应的数据成贝。、&”:返回对象的地址。5)如果程序员重载了某个运算符(如并不意味着重载了 相关的运算符(如等)。1)将运算符重载为类的成员函数 class类名类型名operator运算符

3、(形参表);;类型名类名::operator运算符(形参表)函数体说明:肯调用该函数的对象做为运算符函数的第一个参数肯重载二元运算符时,参数表中应有一个形参。肯重载一元运算符时,参数表应为空(后置“除外)O例:用成员函数重载“+”、实现两个复数的加、减运算#include class complex public:complex(double r=Ozdouble i=0) real=r; imag = i;complex operator + ( const complex &a); complex operator - (const complex &a); void list();pri

4、vate:double real, imag;complex complex:operator + (const complex &a) complex t(real + a.real, imag+ a.imag); return t;rnmnlAv rnmnlAv-nrAratinr -TrnmnlAv2)运算符函数重载为类的友员函数 在类体内说明: friend类型名operator运算符(参数表);在类体外定义运算符函数的一般形式:类型名operator运算符(参数表)说明:肯重载二元运算符时,参数表中应有两个形参。 重载一元运算符时,参数表应有一个形参。但可以重载为成员函数例X用友员函

5、数重载“+叭 X”,实现两个复数的加、减运算#include 一class complexpublic: complex(double r=Ozdouble i=0) real = r; imag=i;friend complex operator + (const complex &a,coi friend complex operator (const complex &azcon void list();private:double real, imag;; | complex operator + (const complex &azconst compl complex t(a.re

6、al+b.realz a.imag+b.imag); return t; !讨论:一元运算符、二元复合赋值运算符(如:+=、-=)常常被重 载为成员函数;其他二元运算符常常被重载为友元函数。A在有些情况下,二元运算符不便于重载为成员函数。例:5.67+c其中,c是类complex的一个对象。将重载为友元 函数时,表达式将被编译程序解释为:operator +(complex (5.67)zc) /正确 (在complex类中应定义了相应的构造函数)。重载为成员函数时,则表达式被解释为: 5.67.operator +(c) /错误例713:编写程序对字符串类重载件运算符和运算符实 现两个字符串

7、的连接。int nl=n; pl=new charnl; strcpy(pl,ps); n+=strlen(p)+l; delete ps; ps=new charn; strcpy(pszpl); strcat(pszp); return * this;cstring &operator+ = (cstring &s)char * pl; int nl=n; pl=new charnl; strcpy(pl,ps);7. 3虚函数主要内容:A什么是虚函数A虚函数的作用A虚函数的定义和使用规则A纯虚函数和抽象类简介多态性的两种实现机制静态多态性可在编译期间确定的多态性。通常称为静态联编(sta

8、tic binding)o重载多态和参数多态一般是静态多 态的。动态多态性在程序运行过程中,才能确定的多态性。通常称为动态联编(dynamic binding)o包含多态和强制多态一 般是动态联编的。仁虚函数的引入:不用虚函数时的静态联编。输出结果:x=5 x=10#include class Baseint x;public :Base(int xl)x=xl; void print( )coutux=,Jxu ”; ; class Derevid : public Baseint y; public :Derevid(int xljnt yl):Base(xl)y=yl; void pri

9、nt( )Base:priiit();coutuy=,yu ”; ; void main()1 d(10520): Base *pa=&a; 调用哪个print函数?Base a(5);Derev迅pa- print(); pa=&d; pa-print();调用哪个print 函数?1虚函数的引入:通过虚函数实现动态多态性。输出结果:X=5 x=10 y=20#include class Base int x;public :Base(int xl)x=xl;virtual void print( )coutvv“x=”vvxvv“ ”; ; class Derevid : public B

10、aseint y;public :Derevid(int xljnt yl):Base(xl)y=yl;void print( )Base:print();coutuy=,y print();谪用哪个print函数?pa=&d;pa-print();调用哪个 print 函数?2虚函数7. 3虚函数A虚函数是类的非静态成员函数。I成贝函数被说明为虚函数后,表示它在派生类中可 能有多种不同的实现。与赋值兼容性结合实现动态多态性。3-虚函数的作用4定义虚函数的一般格式(在类体中)virtual类型名成员函数名(形参表) . 或:virtual类型名成员函数名(形参表);&类的一个成员函数被说明或定

11、义为虚函数后,由该类派 生的类中所有与虚函数函数头相同的函数均为虚函数。5.虚函数的使用规则7. 3虚函数旷虚函数用于继承和派生,在基类中定义。写基类的虚函数在派生类中有多种实现,但函数原 型应保持一致,否则为静态联编。审只能通过基类的指针或引用访问派生类对象来实现动态联编 歹析构函数可以是虚函数,说明形式为:构造函数不能是虚函数virtual 类名 0 . 例78:不使用虚函数的静态联编示例。/求长方形面积double Area() return I * w;void fun(Point *p)/用一个函数输出各类对象的面积 coutArea( )endl;void main( )Line

12、lin(l,3,45); fun(&lin);Circle cir(3,4江0); fun(&cir);Rectangle rec(2z5,7f8);fun(& rec);o运行程序后,输出的面积均为0。例7-9:通过虚函数实现动态多态性。#include class Point double xzy;public:JPointfdouble idouble j):x(i)(j) virtual double Area( )/定义为虚函数,实现动态联纟 return 0.0;111111111111111J f11111class Line:public Point double xlfyl;

13、public: Line(double izdouble jfdouble ilz double jl):Point xl = il;yl=jl;耳o运行程序后,可以正确输出各形状的面积。例710:虚析构函数使用示例。public:B(int n,int m):A(m) size=n; buf=new charn;-B()delete buf;coutH 类B虚析构函数n; private:char *buf;int size;;void main()A *a=new B(10,7); delete a;殳序输出结果:类B虚析构函数类A虚析构函数6.纯虚函数与抽象类7. 3虚函数纯虚函数:如果无法或无需定义基类的虚函数的 函数体,可将该虚函数定义为纯虚函数,形式为: virtual类型名函数名(形参表)=0;抽象类:带纯虚函数的类使用规则:肯抽象类只能作为其他类的基类肯不能定义抽象类的对象,但可以定义它的指 针或引用。例:纯虚函数和抽象类示例。#include const double PI=3.1415926; class shape抽象类定义public:virtual void PrintShapeName()=O; /纯虚函数 virtual double Area()=

温馨提示

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

评论

0/150

提交评论