C--语言程序设计课件

上传人:_impsvz****pswzcf... 文档编号:243138965 上传时间:2024-09-16 格式:PPT 页数:33 大小:142.50KB
返回 下载 相关 举报
C--语言程序设计课件_第1页
第1页 / 共33页
C--语言程序设计课件_第2页
第2页 / 共33页
C--语言程序设计课件_第3页
第3页 / 共33页
点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,C+,语言程序设计,第八章 多态性,C+,语言程序设计,1,本章主要内容,多态性,运算符重载,虚函数,纯虚函数,抽象类,2,重点和难点,重点:多态性的意义;实现多态性的两种途径:函数重载和虚函数,特别是运算符函数的重载;怎样利用虚函数实现运行时的多态性;纯虚函数以及抽象类的声明与定义;,难点:运算符函数的重载;怎样利用虚函数实现运行时的多态性。,3,多态性的概念,多态性是面向对象程序设计的重要特征之一。,多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。,多态的实现:,函数重载,运算符重载,虚函数,4,问题举例,复数的运算,class complex/,复数类声明,public:,complex(double r=0.0,double i=0.0) /,构造函数, real=r;,imag,=i; ,void display();/,显示复数的值,private:,double real;,double,imag,;,;,运算符重载,5,问题举例,复数的运算,用“,+,”,、,“,-,”,能够实现复数的加减运算吗?,实现复数加减运算的方法,重载,“,+,”,、,“,-,”,运算符,运算符重载,6,问题举例,复数的,+,运算,复数运算符重载的例子,(,成员函数,),重载,“,+,”,、,“,-,”,运算符,运算符重载,7,运算符重载的实质,(,根据示例总结,),运算符重载是对已有的运算符赋予多重含义,必要性,C+,中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类),实现机制,利用了函数重载的机制,将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。,编译系统对重载运算符的选择,遵循函数重载的选择原则。,运算符重载,8,运算符重载,规则和限制,可以重载,C+,中除下列运算符外的所有运算符:,. .* : ?:,只能重载,C+,语言中已有的运算符,不可臆造新的。,不改变原运算符的优先级和结合性。,不能改变操作数个数。,经重载的运算符,其操作数中至少应该有一个是自定义类型。,9,两种形式,重载为类成员函数。,重载为友元函数。,运算符重载,10,运算符函数,(,把运算符作为函数,),声明形式,函数类型,operator,运算符(形参),.,重载为类成员函数时,参数个数,=,原操作数个数,-1,(后置,+,、,-,除外),重载为友元函数时,参数个数,=,原操作数个数,,且至少应该有一个自定义类型的形参。,运算符重载,11,运算符成员函数的设计,双目运算符,B,如果要重载,B,为类成员函数,使之能够实现表达式,oprd1 B oprd2,,,其中,oprd1,为,A,类对象,则,B,应被重载为,A,类的成员函数,形参类型应该是,oprd2,所属的类型。,经重载后,表达式,oprd1 B oprd2,相当于,oprd1.operator B(oprd2),运算符重载,12,运算符成员函数的设计,(,单目,),前置单目运算符,U,如果要重载,U,为类成员函数,使之能够实现表达式,U,oprd,,,其中,oprd,为,A,类对象,则,U,应被重载为,A,类的成员函数,无形参。,经重载后,表达式,U,oprd,相当于,oprd.operator,U(),运算符重载,13,运算符成员函数的设计,后置单目运算符,+,和,-,如果要重载,+,或,-,为类成员函数,使之能够实现表达式,oprd,+,或,oprd,-,,,其中,oprd,为,A,类对象,则,+,或,-,应被重载为,A,类的成员函数,且具有一个,int,类型,形参,。,经重载后,表达式,oprd,+,相当于,oprd.operator,+(0),运算符重载,14,问题举例,复数的,+,运算,利用友元函数重载运算符,重载,“,+,”,、,“,-,”,运算符,运算符重载,15,运算符友元函数的设计,如果需要重载一个运算符,使之能够用于操作某类对象的私有成员,可以此将运算符重载为该类的友元函数。,函数的形参代表依自左至右次序排列的各操作数。,后置单目运算符,+,和,-,的重载函数,形参列表中要增加一个,int,,,但不必写形参名。,运算符重载,16,运算符友元函数的设计,双目运算符,B,重载后,表达式,oprd1 B oprd2,等同于,operator B(oprd1,oprd2 ),前置单目运算符,B,重载后,,表达式,B,oprd,等同于,operator,B(oprd,),后置单目运算符,+,和,-,重载后,,表达式,oprd,B,等同于,operator B(oprd,0 ),运算符重载,17,+,运算符的重载,利用成员函数重载,+,运算符,运算符重载,18,+,运算符的重载,利用友元函数重载,+,运算符,运算符重载,19,静态绑定与动态绑定,绑定,程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。,静态绑定(静态联编),联编工作出现在编译阶段,用对象名或者类名来限定要调用的函数。,动态绑定,联编工作在程序运行时执行,在程序运行时才确定将要调用的函数。,20,静态绑定与动态绑定,静态绑定实例,21,静态绑定与动态绑定,动,态绑定实例,动,态绑定,也称为运行时的多态,动态绑定指在程序运行时才确定将要调用的代码在哪里,?,编译程序时无法确定,.,相同的消息发送给不同的对象,将导致不同的行为,22,虚函数,(,总结,),虚函数是动态绑定的基础。,是非静态的成员函数。,在类的声明中,在函数原型之前写,virtual,。,virtual,只用来说明类声明中的原型,不能用在函数实现时。,具有继承性,基类中声明了虚函数,派生类中无论是否说明,,同原型,函数都自动为虚函数。,本质:不是重载声明而是覆盖。,调用方式:通过基类指针或引用,执行时会根据,指针指向的对象的类,,决定调用哪个函数。,虚 函 数,23,例,8.4(,自学,跳过,),#include ,using namespace std;,class B0/,基类,B0,声明,public:/,外部接口,virtual,void,display,() /,虚成员函数,cout,B0:display(),endl,;,;,class B1: public B0/,公有派生, public:,void,display,() ,cout,B1:display(),endl,; ,;,class D1: public B1/,公有派生, public:,void,display,() ,cout,D1:display()display(); ,void main()/,主函数,B0 b0, *p;/,声明基类对象和指针,B1 b1;/,声明派生类对象,D1 d1;/,声明派生类对象,p=,&b0,;,fun(,p,);/,调用基类,B0,函数成员,p=,&b1,;,fun(,p,);/,调用派生类,B1,函数成员,p=,&d1,;,fun(,p,);/,调用派生类,D1,函数成员,运行结果:,B0:,display(),B1:,display(),D1:,display(),25,25,虚析构函数,(,难,),何时需要虚析构函数?,当你可能通过基类指针删除派生类对象时,如果你打算允许其他人通过基类指针调用对象的析构函数(通过,delete,这样做是正常的),并且被析构的对象是有重要的析构函数的派生类的对象,就需要让基类的析构函数成为虚拟的。,虚 函 数,26,虚析构函数,(,难,),虚析构函数的使用,虚 函 数,27,抽象类,带有纯虚函数的类称为抽象类:,class,类名,virtual,类型 函数名,(,参数表,),=0,;,/,纯虚函数,.,纯虚函数与抽象类,28,抽象类,纯虚函数与抽象类,作用,抽象类为抽象和设计的目的而声明,将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为。,对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。,注意,抽象类只能作为基类来使用。,不能声明抽象类的对象。,构造函数不能是虚函数,析构函数可以是虚函数。,29,例,8.6,举例,纯虚函数与抽象类,#include ,using namespace std;,class B0 /,抽象基类,B0,声明, public: /,外部接口,virtual,void,display,( ),=0,; /,纯虚函数成员,;,class B1: public B0 /,公有派生, public:,void,display,()cout,B1:display(),endl,; /,虚成员函数,;,class D1: public B1 /,公有派生, public:,void,display,()cout,D1:display()display(); ,void main()/,主函数,B0 *p;/,声明抽象基类指针,B1 b1;/,声明派生类对象,D1 d1;/,声明派生类对象,p=,&b1,;,fun(,p,);/,调用派生类,B1,函数成员,p=,&d1,;,fun(,p,);/,调用派生类,D1,函数成员,运行结果:,B1:,display,(),D1:,display,(),31,31,应用,纯虚函数与抽象类,重载运算符的应用,抽象类的应用,32,作业,纯虚函数与抽象类,本章习题,上机,:,实验大纲,33,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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