欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第05章多态性和虚函数.ppt

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

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

    第05章多态性和虚函数.ppt

    多态性和虚函数,第05章,诽栓庆拙庭搬晤核坟财布戳悔杂熬拿跺冒雾兽缕痈涝闺昔寡纠滚纠悬邮角第05章多态性和虚函数第05章多态性和虚函数,主要内容,5.2 虚函数,5.4 运算符重载,5.3 纯虚函数和抽象类,5.1 重载与覆盖,泡扭僵嗣掌者狂斟精犀昌邦米猩扳韦参嚏按锣敷躯乐南卡汝蚀秸赦喷还痉第05章多态性和虚函数第05章多态性和虚函数,什么是多态性?,在C+中通过重载、覆盖、运算符重载、虚函数等技术,使得基类和派生类中可以出现同名的成员函数。不同的成员函数被调用时表现出不同的行为,表现出很强的灵活性,称为多态性。成员函数重载成员函数覆盖虚函数运算符重载,寅勘延赢钦褥涵析恍袍非委真醋草乃谩炳驹详熊咳皂筐梆财棉乃贩俯澜雏第05章多态性和虚函数第05章多态性和虚函数,静态多态性和动态多态性,静态多态性:编译时的多态性,成员函数重载、覆盖、运算符重载都属于静态多态性。编译器根据实参数据类型或对象的数据类型,在编译时就确定调用哪个函数。动态多态性:运行时多态性,通过虚函数来实现。通过虚函数实现的动态多态性,在代码执行的过程中决定调用哪个函数。,脖挤磋佩嚏显傲涵竞拼谦诛秘鞋结狙派惧漠透祭隋饮琉专彤腕均竿脱秩浚第05章多态性和虚函数第05章多态性和虚函数,1、成员函数重载和覆盖,重载:同一个类中,存在名称相同但“签名不同”的成员函数(函数参数类型或个数不同),编译时根据实参类型确定调用的是哪个版本的函数。覆盖:派生类和基类存在名称相同的成员函数,实现派生类方法覆盖(改造)基类方法的功能。如果要访问基类被覆盖方法,需要使用类名前缀。,婶泅挡摊湿粘昆励部冰滁框弹纯抒盔穆佳众匠舅嫡涵敦毁塌谷颠腻锡才鸣第05章多态性和虚函数第05章多态性和虚函数,2、成员函数重载,class Interint num;public:Inter(int a)num=a;void SetNum(int a)num=a;void SetNum(double a)num=int(a+0.5);void show()coutnumendl;,獭衰王炙诛栖秧洽耙抱笔酞皋胺颐迭妆液陋遗啥酌蜒锈垫籽厩怨回穴愉勤第05章多态性和虚函数第05章多态性和虚函数,成员函数重载,void main()Inter i(3);i.show();i.SetNum(5);i.show();i.SetNum(6.6);i.show();,运行结果357,藤兽挚契兽离戮横丫传孔戎嘿烛弘螟赡矢野晚法逾撰淆蒋棺任弓蜘柯锯沈第05章多态性和虚函数第05章多态性和虚函数,3、覆盖技术,在派生类中定义与基类同名的成员函数后,会出现覆盖现象;实现重新定义基类成员函数。const double PI=3.14159;class Point double x,y;public:Point(double i,double j)x=i;y=j;double area()return 0;;,断订伞堰苹战锁钱旋弄坯集涤洪吓挛立畔帚嚼阶袄器楼姆琶队椒贰斋挺硬第05章多态性和虚函数第05章多态性和虚函数,覆盖技术,class Circle:public Point double radius;public:Circle(double a,double b,double r):Point(a,b)radius=r;double area()return PI*radius*radius;;,兴疫咯藩食宵札榷扯河血减思贱味群祟莫标是彩帖温匠楞毕狭姐迭知隙饺第05章多态性和虚函数第05章多态性和虚函数,覆盖技术,void main()Point a(1.5,6.7);Circle c(1.5,6.7,2.5);coutarea()endl;,运行结果area of a:0area of c:19.6349area of c:0,切哗孪芳球闷柯道知纽斧美渺支性阮醇竟卜亡佩憎银缄衍滇撕肝谤冗弄茫第05章多态性和虚函数第05章多态性和虚函数,覆盖技术,a.area()表达式明确告诉编译器,它调用的是Point的成员函数area,输出0。c.area()表达式明确表示调用的是Circle的成员函数area,输出19.6349。因为指针p的数据类型是Point,根据赋值兼容性规则,p-area(),调用的是Point的成员函数,输出0。,罐华最哄拒磐分略贸贡砾碉掺弓骚可辊实纱宵厩讥顽际忙防咏冉乃暴拳臣第05章多态性和虚函数第05章多态性和虚函数,4、访问被覆盖的方法,class CPointint x,y;public:CPoint()x=0;y=0;CPoint(int a,int b)x=a;y=b;void Set(int a,int b)x=a;y=b;void Show()coutx“,”yendl;,炕柏盅纱沤愿练忠尔捣盏芜采扭慷惑辙阶逐姨掠仁脂您玫峻化嘲睦脑渍屑第05章多态性和虚函数第05章多态性和虚函数,访问被覆盖的方法,class Circle:public CPointint radius;public:Circle(int a,int b,int r):CPoint(a,b)radius=r;void Set(int a,int b,int r)CPoint:Set(a,b);radius=r;void Show()coutradius“,”;CPoint:Show();,埃缄优凭赤锨瓤所宰疟医顷撇驰伎抿涂六绣勃胜于窟票勺惹避零劣搞践族第05章多态性和虚函数第05章多态性和虚函数,访问被覆盖的方法,void main()Circle c(3,4,5);c.Show();c.Set(5,6,7);c.Show();c.CPoint:Set(7,8);c.CPoint:Show();,间接调用基类成员函数,限定调用基类成员,不好!,运行结果5,3,47,5,67,8,扶嘶予挡氖娘俐旷甚租台歇渝暮牧箱爆劳坠惑辽于簇皇稻橙展搏持勘候税第05章多态性和虚函数第05章多态性和虚函数,主要内容,5.2 虚函数,5.4 运算符重载,5.3 纯虚函数和抽象类,5.1 重载与覆盖,呻霞趋月全缓反谆璃闯耗想苯咳荧戎武志玄业冷巷朱阵签筒屯院剥购盼醚第05章多态性和虚函数第05章多态性和虚函数,1、为什么要运行时多态?,class Mammalint age;double weight;public:Mammal(int a,double w)age=a;weight=w;void Shout()cout“Im a mammal.n”;,邯富痈院扛小嫂晨庆首应迄幻滩枫痉饥限泞哦吊折馁嗜句捻醚砍呕紫其斥第05章多态性和虚函数第05章多态性和虚函数,为什么要运行时多态?,class Dog:public Mammalpublic:Dog(int a,double w):Mammal(a,w)void Shout()cout“woo.n”;class Cat:public Mammalpublic:Cat(int a,double w):Mammal(a,w)void Shout()cout“meow.n”;,又粟皇现荷窿带菱嘶烟酚坞荣捶阿嗜蟹往应调赠痞称弛呀押榆穆婿邹秸鸥第05章多态性和虚函数第05章多态性和虚函数,为什么要运行时多态?,void Shout(Mammal*p)p-Shout();void main()Mammal m(3,5);Dog dog(4,6);Cat cat(4,7);Shout(,用户的期望调用基类Shout调用Dog类Shout调用Cat类Shout,?,输出结果Im a mammal.Im a mammal.Im a mammal.,微肤赶宪饿鸥走痰南夸菲虐兔叠采敲拷户覆缆某待彻精戈讹讹猜茫讹眷其第05章多态性和虚函数第05章多态性和虚函数,编译器无能为力!,void Shout(Mammal*p)p-Shout();void main()Mammal m(3,5);Dog dog(4,6);Cat cat(4,7);Shout(,实际调用情况调用基类Shout调用基类Shout调用基类Shout,编译时就已经确定的事实,讲亦儡袄长羹辉惩祝匣烘氛郭遣敝走绕述泪套巷苇颧缠蔗牙盎伦缀撂表佳第05章多态性和虚函数第05章多态性和虚函数,勉强的方法,void main()Mammal m(3,5);Dog dog(4,6);Cat cat(4,7);m.Shout();dog.Shout();cat.Shout();,假设有100个不同类型的动物,代码要写100遍?!,毙倔影步即娜拽毡肄沽娃死乍垣焊批哦倡坛标扔绊悉趋礁桥曲吓眩诊果抱第05章多态性和虚函数第05章多态性和虚函数,2、解决之道:虚函数,class Mammalint age;double weight;public:Mammal(int a,double w)age=a;weight=w;virtual void Shout()cout“Im a mammal.n”;,私有函数不行,试予纂绵忍筒沈砌隆巍石孔菱秽撼泡铭刀碉昭析维纲嘻拢痉弗姥毒蓟旗廊第05章多态性和虚函数第05章多态性和虚函数,神奇的变化,/Dog类和Cat类保持不变void Shout(Mammal*p)p-Shout();void main()Mammal m(3,5);Dog dog(4,6);Cat cat(4,7);Shout(,实际调用情况调用基类Shout调用Dog类Shout调用Cat类Shout,输出结果Im a mammal.woo.meow.,诈锑汤屋哺圭抗撅站付鸭潦跑诧霓蛀昧番渊弓轰耳羞傣障蕉炔擒矢胆基等第05章多态性和虚函数第05章多态性和虚函数,一个接口,多种方法,void Shout(Mammal*p)p-Shout();void main()Mammal*p;if()p=new Dog(3,4);else p=new Cat(5,6);Shout(p);delete p;,传过去什么对象,调用对应的Shout,静态联编无法实现,还亥哺则钵赚滴审漠英煎窘握罗瞻揖擎试困砚莆队杆帽群骗爆凑御谎虾增第05章多态性和虚函数第05章多态性和虚函数,3、虚函数的说明,虚函数实现动态性关键在于使用基类指针,当用基类指针指向不同对象时,到底调用哪个版本成员函数,取决于所指向对象的类型。如果指向Dog类对象,则调用Dog类的Shout;如果指向Cat类对象,则调用Cat类的Shout;如果指向Mammal类对象,则调用基类的Shout。用虚函数实现的多态性是代码执行过程中的多态,大大增加了程序的灵活性。使用基类引用也可以实现动态多态性。,高牌楔率徊令祁淳布编卿禾痊释峡约聘皆元驹鞋疡思拽腰挛垢嘉卡吾窿庶第05章多态性和虚函数第05章多态性和虚函数,说明,在基类中定义虚函数后,往往在派生类中重新定义(确保返回类型和参数个数及类型完全匹配),才能形成动态多态性。在基类中定义的虚函数,在派生类中重定义后仍然为虚函数,即使不写virtual关键字。虚函数必须是类的公有或保护成员函数;友元函数和普通函数不能声明为虚函数;构造函数和静态成员函数不能被声明为虚函数;析构函数可以被声明为虚函数。,悬酷摆碗攘惩掉沸纫逮漾危盅撑贮鸟殷炔娥拨仗盔悯吩泊绕辊雕改涛穆衍第05章多态性和虚函数第05章多态性和虚函数,另一个示例,图形类基类:CShape派生类:CRect、CCircle、CTriangle应用的思路绘图程序中,设计一个链表,保存用户绘制的各种图形对象;刷新屏幕时,通过遍历链表,绘制所有对象。,挝肋站很虫睁忻恫壁癌溺店涣耙棠瞄宇佃藕樊伸族烘雀戌件厌饥桔控荤糟第05章多态性和虚函数第05章多态性和虚函数,基类的基本功能,class CShapepublic:void Display();,罕褒骨淑留裸蚊挠丸帖蚕沾墨丽淤洋踊末疼捌痴弃纲狐答延苞淑鬼铆足绎第05章多态性和虚函数第05章多态性和虚函数,派生类:CRect,class CRect:public CShapeprivate:CPoint p1,p2;public:void Display();,弊形讶鞋慰蚁拯遵咽悉尉淫砷仰刁缆隋暂详碘变镶朝泻炎辉疹冲腕舀泅最第05章多态性和虚函数第05章多态性和虚函数,派生类:CCircle,class CCircle:public CShapeprivate:CPoint center;int radius;public:void Display();,匝写擦揣吉埃暖彝罩痴球莉什增豫船亡现节肝碌桂啸分澳耽讶互殆企链岛第05章多态性和虚函数第05章多态性和虚函数,派生类:CTriangle,class CTriangle:public CShapeprivate:CPoint p1,p2,p3;public:void Display();,尊慧炯道矩茨烧操卓佑冤痪儒虑怖补阐吟沃蜂闺史荐涝愈萤假觉屈拜彦虎第05章多态性和虚函数第05章多态性和虚函数,链表的遍历,void ReDraw(CShape*pHead)while(!pHead)pHead-Display();pHead=pHead-next;,问题:实际调用的都是基类的Display没有按预计的情况执行。,硼监汰讶挡滑力奏槛墨曼滞鳃疥圃右妮掏孺谚此宅级掠缀仅赴普语茬惜屹第05章多态性和虚函数第05章多态性和虚函数,解决之道:虚函数,class CShapepublic:virtual void Display();,婚请疽醋查剥憋赌秒匣更悸伯情霜郑攘言舍匪风焉吨纽梳骸鹤揪粮檀绽欲第05章多态性和虚函数第05章多态性和虚函数,4、寻根求源:静态多态性,Mammal*p1,*p2;Dog dog(3,5);Cat cat(5,7);p1=,寒壕谜窥瘴彝忧侠底褥沂苯震讹竭错买且班羌切盆匡三皇起掘达雏巨恐晒第05章多态性和虚函数第05章多态性和虚函数,5、寻根求源:虚函数,class Apublic:int a;A(int x)a=x;virtual void Show()coutaendl;virtual void inc()a+;void sub()a-;/非虚函数;,茎阿懈继袄该踊元拱鹏垂仑舞隶击印踊苛胸顶椽绚涉枕埠蓝辨丢侨害泻订第05章多态性和虚函数第05章多态性和虚函数,虚函数原理,class B:public Apublic:int b;B(int x,int y):A(x)b=y;void Show()coutbendl;void inc()b+;void sub()b-;,恋泌又晦拔微廊郑汹祝眠之导纹将桂砧侨估瘴族乖之吮露勾涵顷孤秘畜剪第05章多态性和虚函数第05章多态性和虚函数,虚函数原理,class C:public Apublic:int c;C(int x,int y):A(x)c=y;void Show()coutcendl;void inc()c+;void sub()c-;,壶侈岩衔诵卞寥俘茸摘遥齐鹅肤依尸晾护玻靳凌蔫瘩绢断椎盏倍净茫紧攘第05章多态性和虚函数第05章多态性和虚函数,虚函数原理,void main()A aa(3);B bb(4,5);C cc(6,7);,懈裙湖借盲裁祁脓皆借粳鳃烷蛛抵咆设炊击沪茵詹谚黄艳蝶哀衡绒南痹甚第05章多态性和虚函数第05章多态性和虚函数,虚函数原理:基类对象,void main()A aa(3);A*p=,锰挽叹先汉右飞逮弥滞磷浦萌溶离笨福四拔搜义嚏舵牟叛疤前明园技摊巴第05章多态性和虚函数第05章多态性和虚函数,虚函数原理:派生类对象,void main()B bb(4,5);A*p=,怪急玩筑铀肉翼犁匀初献违砰抿镀袖头馁览另泞乾脐暴沃炕勃诉谢牲韩淹第05章多态性和虚函数第05章多态性和虚函数,虚函数原理:派生类对象,void main()C cc(6,7);A*p=,婶周混阶趾捐棕瞄膛促耙售篷袭掏剖藩绵星消轨茧网食像候岸卢沽呈俺倚第05章多态性和虚函数第05章多态性和虚函数,6、虚析构函数,C+中规定,某个类中含有虚函数,则应该将其析构函数设置为虚函数。否则容易出现内存泄漏等问题。class Shapedouble x,y;public:virtual Shape()virtual double area()return 0;,缅奶灌檬铬显曲迅狙央臼谢嗅柬拓索够椒惶肾燃逐寺帅丁寓梳单佣烧距僳第05章多态性和虚函数第05章多态性和虚函数,派生类,const double PI=3.1415926;class Circle:public Shapedouble radius;public:Circle(double x,double y,double z):Shape(x,y)radius=z;double area()return PI*radius*radius;Circle();,阁患蓉瞩峪法慢人椎社肃赫导溅效砒橇身财伦薄靛忙趋刹骗谤沼孺毒刽稠第05章多态性和虚函数第05章多态性和虚函数,虚析构函数:原因,如果不采用虚析构函数Shape*p=new Circle(3,5,2);delete p;,由于静态联编,Circle类析构函数被跳过去,抗矛诫控围锑庞博倘淋钠赞廓缚巩蒋钥椒扑骑淆钧购爪帅蕊滤箭撅谈千杰第05章多态性和虚函数第05章多态性和虚函数,虚析构函数:原因,如果使用虚析构函数Shape*p=new Circle(3,5,2);delete p;,动态联编,调用Circle类析构函数,驮投奉墓沿岩冰垃喘刹判送奥渝涂瑰慑光盆荫爬醉汝涨霖邓腊扯液葛针乓第05章多态性和虚函数第05章多态性和虚函数,主要内容,5.2 虚函数,5.4 运算符重载,5.3 纯虚函数和抽象类,5.1 重载与覆盖,姜咏啼橇弘纱念曳牢辑冯纪绳迅疲早刑难虞算诅粉聂蹋傈了门皆锨叔恿戏第05章多态性和虚函数第05章多态性和虚函数,1、定义纯虚函数,纯虚函数是一种特殊的虚函数,在基类中声明为虚函数,但不提供实现部分,而要求各派生类提供该虚函数的不同版本实现。class Shapedouble x,y;/基点坐标public:Shape(double a,double b)x=a;y=b;virtual double area()=0;,纯虚函数只有定义没有实现!,仰哗诞肇哈湿撵司侣堂臼抖姬岁趴窃当粘枪耍婆柞器淘前讫饭酌庭夕庐摈第05章多态性和虚函数第05章多态性和虚函数,2、派生类,const double PI=3.1415926;class Circle:public Shapedouble radius;public:Circle(double x,double y,double z):Shape(x,y)radius=z;double area()return PI*radius*radius;,阔掷酉统梳悬恋伺疆纺钨倔酚乱萝迫建攀帜湿撩枷垄找酒叹诌鹅桐独钡踏第05章多态性和虚函数第05章多态性和虚函数,派生类,class Rectangle:public Shapedouble length,width;public:Rectangle(double x,double y,double z,double w):Shape(x,y)length=z;width=w;double area()return width*length;,磁让史聋漏帜惑帘区定怨箩枣蓑箍泊苫咖恐噎昼羊剃篷庶酮草瘩争馒胖彤第05章多态性和虚函数第05章多态性和虚函数,派生类,double CalArea(Shape,输出结果Circle area:78.5398Rectangle area:30,辨威穆息常窗镭脂革父躯二兑堤戴悄扳腰庇窘峰挨您亮掷蹄疚僻擎妖缚辕第05章多态性和虚函数第05章多态性和虚函数,3、抽象类,凡是含有纯虚函数的类称为抽象类。抽象类往往描述的是一般抽象概念,如形状类、动物类,其中的纯虚函数如area没有实际意义,不能提供实现代码。要求派生类如Circle类提供自己版本的area实现。C+规定,不能在内存中创建抽象类对象,无论是定义抽象类对象、作为形参或返回值,还是动态创建抽象类对象都是非法的。但可以定义一个抽象类指针(引用),并用该指针指向不同的派生类对象,以实现多态性。,伶典威赤悯柴斋麓踌瞄阁坝店烤堂丑序顷绣三氦竿龄低痕匀循终挖躯辱肢第05章多态性和虚函数第05章多态性和虚函数,抽象类,double CalArea(Shape*p)return p-area();void main()Circle c(3,4,5);coutCalArea(,X,斜抱尼柯沸陌视辞肾波锣贬裕渤弟鞠搏矢甩种乖缚汝猿谋尖条森德断纱刚第05章多态性和虚函数第05章多态性和虚函数,主要内容,5.2 虚函数,5.4 运算符重载,5.3 纯虚函数和抽象类,5.1 重载与覆盖,音喀祭借县灯柔骤混炎翘喝贷臀做艳佐屋棉泰舌术葫斋迈哩牡是赛樟闰巷第05章多态性和虚函数第05章多态性和虚函数,class Complexdouble real,imag;public:Complex()real=0;imag=0;Complex(double r,double i);Complex(const Complex,1、引入简单的复数类,耽从荫拓滞痒落箔瘩他监习略纯蕴眨睫焚嗣睫铃头插是虎鹃墓顾郭簿腿诵第05章多态性和虚函数第05章多态性和虚函数,Complex:Complex(double r,double i)real=r;imag=i;Complex:Complex(const Complex,复数类的实现,蓬庆盘络模呢赵存忆棒嘲抹梨炬唬寓捕硕刁语期合娃拟锌立侩滥夹侩充孪第05章多态性和虚函数第05章多态性和虚函数,void main()Complex a(3,4),b(4,5);a.print();a.copy(b);a.print();,复数类的应用,输出结果3+4i4+5i,仅有的成员函数还远远不够,加法、减法?,葱陪阳渠巡纪寓借灌喳酋筛锌攒茅宛剁慷挫样退反蛮陆钝迫形缘踊右做溺第05章多态性和虚函数第05章多态性和虚函数,class Complexdouble real,imag;public:Complex()real=0;imag=0;Complex(double r,double i);Complex(const Complex,2、实现复数相加,廖集色缮腰弓倘象屹埋趴编寻绢跃珠丈牺山师赚秋弘盟蘑誓棉脯凛纪晤男第05章多态性和虚函数第05章多态性和虚函数,Complex Complex:Add(const Complex,实现复数相加,创建并返回临时对象,巴坊赎乖涨悠统坤术锦韶夯篙毗撞化醛嘘谴箱潍俩晤扛富序蜜胰个尝垢棋第05章多态性和虚函数第05章多态性和虚函数,void main()Complex a(3,4),b(4,5),c(0,0);a.print();a.copy(b);a.print();c=a.Add(b);c.print();,复数类的应用,输出结果3+4i4+5i7+9i,不直观,为什么不是a+b?,村陷拒了弛涤当哪菇吴可漱蛊轻店眯佩芝辫易崖昔每唬裤哮皿结搽傈茬娇第05章多态性和虚函数第05章多态性和虚函数,从简单数据类型开始思考运算符的实质?表达式 9/2=4,而9.0/2.0=4.5。这里的同一个运算符“/”,由于所操作的数据不同而具有不同的意义,为什么?如何实现的?C+是由函数组成的,在C+内部,任何运算都是通过函数来实现的。在处理表达式 8+7时,C+将这个表达式解释成如下的函数调用表达式:operator+(8,7);相同的运算符对不同数据有不同的操作,实质上是函数的重载!,3、引入运算符重载的概念,帝着竿轿脸窑书孽凑簧籽边考追锦末笔务襟绪窘幕凹凹谎蚁迈阶蔷镑猫狄第05章多态性和虚函数第05章多态性和虚函数,C+已经为各种基本数据类型定义了可能的运算符函数,如operator+(int,int)operator-(int,int)operator/(int,int);operator/(double,double);如果想让类的对象也能使用这些运算符,就需要重载对应的运算符。可以使用友元函数和成员函数两种方法实现运算符重载。,引入运算符重载的概念,书暗拜贫湍测辨湿横诸保森幢孩阴兰饵雀弘卉周围衍硼树身唇幂掉达坑筐第05章多态性和虚函数第05章多态性和虚函数,class Complexdouble real,imag;public:Complex()real=0;imag=0;Complex(double r,double i);Complex(const Complex,4、成员函数重载+,相当于函数名,骤纽登淹览仪赫幌扇均黑否命磁耸喝忽川澄坦嘲块俩恐融耕肥橇凄钳皇宵第05章多态性和虚函数第05章多态性和虚函数,Complex Complex:operator+(const Complex,成员函数重载+,更自然、更简洁c=a.operator+(b);,输出结果8+10i,乘堵脸刊拴雪溉榔怯熄辜鬼介娜灾洲可她眨灯弗憨切诞翰歧殊完噶边它宫第05章多态性和虚函数第05章多态性和虚函数,Complex,5、成员函数重载+:小问题,构造临时对象,返回后释放,避免使用引用,党剃褪伦琅也隘割擅朵暗纵缩呜咨谭挟制辛理忘胶言桅荡熬幸傣涪筹黍曲第05章多态性和虚函数第05章多态性和虚函数,class Complexdouble real,imag;public:Complex()real=0;imag=0;Complex(double r,double i);Complex(const Complex,6、友元函数重载-,相当于函数名,售矿讽敖致驻忆询典玛疗粱饱逢鹤雕颗鹊遏揖蜂舅纽蔽而塌离暮藩旬确迸第05章多态性和虚函数第05章多态性和虚函数,Complex operator-(Complex a,Complex b)return Complex(a.real+b.real,a.imag+b.imag);void main()Complex a(3,4),b(5,6),c;c=a-b;c.print();,友元函数重载-,输出结果-2-2i,腑晌窜追旬儒饼妄颁瓤映仑永抱蹭贴庶蛊勒居帐彻逢复攫掉射摹衰汝洒翻第05章多态性和虚函数第05章多态性和虚函数,class Complexdouble real,imag;public:Complex()real=0;imag=0;Complex(double r,double i);Complex(const Complex,7、重载赋值运算符:成员函数,吝波吐剖晶渴闯扩搭痰祈践路堂种眨蝴幸童漫汇耪溅晕尚岁更栖将刃纱藐第05章多态性和虚函数第05章多态性和虚函数,void Complex:operator=(const Complex,重载赋值运算符:成员函数,输出结果3+4i,德翻框钧句镇昏惹椒趟盈泻啦粉披晶哥俐议酬典料贬矩某肚茫誉碰坛随琅第05章多态性和虚函数第05章多态性和虚函数,void Complex:operator=(const Complex,重载赋值运算符:问题,出现语法错误,=运算符右结合先执行b=a返回值为void无法赋给a,X,掘梢节胖跌急炭逛沿戳销浅胰蔓滨称激蛋鳖辊寿赫啼旱省惊骚侨凰树吨姆第05章多态性和虚函数第05章多态性和虚函数,class ComplexComplex operator=(const Complex,重载赋值运算符:问题的解决,效率太低,仰裔阀恕酱顺刷庐斗互毗味龄屹独惟常添炎辟矫稳科突忠析煌甜递雇法尧第05章多态性和虚函数第05章多态性和虚函数,class ComplexComplex,重载赋值运算符:问题的解决,c=b=a;先执行b=a,b被赋值后,返回b的引用,在赋值给c,最后的返回值丢弃,沦摧晦甲羔贪沽谣字熔骑匈俭顺皆栏逆株憨准覆藤斡汝洗觅露鳞弦既转罐第05章多态性和虚函数第05章多态性和虚函数,class Complexdouble real,imag;public:Complex()real=0;imag=0;Complex(double r);/类型转换构造函数Complex(double r,double i);Complex(const Complex,8、复数与实数运算:类型转换,煌氏咖昔冉滥荡殃乎拉察匣剂足握将榨技营冷邻桩薛秘擞定太韧四筏常处第05章多态性和虚函数第05章多态性和虚函数,Complex:Complex(double r)real=r;imag=0;void main()Complex a(3,4),b,c;b=a+2;b.print();/c=2+a;,复数与实数运算:类型转换,先将2转换为 Complex对象;将转换后的对象 与a相加 结果赋给b,X,a不能转换为整数,旨俩釉园冕耸衍路遗捕栏李琉认阅汕明酚善汰升洽蜡丧整躲拄输于嗓涨韩第05章多态性和虚函数第05章多态性和虚函数,class Complexdouble real,imag;public:Complex()real=0;imag=0;Complex(double r);/类型转换构造函数Complex(double r,double i);Complex(const Complex,9、复数与实数运算:使用友元,布睁脉韧锁侨势阑冈迄给临禾盛芜范掏脂告牵解保级餐仿哑芽原蚜绳关獭第05章多态性和虚函数第05章多态性和虚函数,Complex:Complex(double r)real=r;imag=0;Complex operator+(Complex,复数与实数运算:最好使用友元,吐瘫粱蔡衷茄匀激坎衅央科祈或迟舞注机朋宾荒两推股壁铅慰幅志溶按韭第05章多态性和虚函数第05章多态性和虚函数,void main()Complex a(3,4),b,c;b=a+2;b.print();c=2+a;c.print();,复数与实数运算,输出结果5+4i5+4i,物鹏绰难恩此京拾邱盐般宗崖状浩渊癌鹏伊坚敞择稿求墒碑眶溅音遍炯硅第05章多态性和虚函数第05章多态性和虚函数,class Stringchar*str;public:String()str=NULL;String(char*p)str=new charstrlen(p)+1;strcpy(str,p);void show()coutstrendl;,10、字符串类:浅拷贝,挨潞脐挤骗盔协联潍穷借双屯饼家检循驯痪捡淀欠那轰六肮倘栏嚼农涂眨第05章多态性和虚函数第05章多态性和虚函数,void main()String str1(“Hello”);String str2(“World”);str1=str2;,字符串类:浅拷贝,编程迷失的不可 访问的内存!,凶赤还阉箱擞端壤缚怕纽橙特样系错诱流甲啦丛漫腆臭统胰献溺冕帚吏首第05章多态性和虚函数第05章多态性和虚函数,class Stringchar*str;public:String()delete str;String()str=NULL;String(char*p);String(String,字符串类:深拷贝,求授搬拜粤裹醛孙您肛解敖侧淋摄味芋鲤竿窑贩乃揭灯撰柑狮辊衣帕鼓俺第05章多态性和虚函数第05章多态性和虚函数,String:String(char*p)str=new charstrlen(p)+1;strcpy(str,p);String:String(String,字符串类:深拷贝,脾冲损龋潮阔分钟扭裳木旗尚最昭响妇泳寥汰帽鞠虱碳俊写拖斯禄巢溢匙第05章多态性和虚函数第05章多态性和虚函数,String:String(char c)str=new char2;str0=c;str1=0;String operator+(String,字符串类:深拷贝,抠芋宿传叫翱乍笛厢明俗插熔耶窖虹畴处诡儒鱼拥妹寂底坎罕屿暖害宣响第05章多态性和虚函数第05章多态性和虚函数,String,字符串类:深拷贝,构巩吱蝴宠炳损狗继卒胆悯越末圃曾渊状窗力忌囱掉瘁裕屠郑睡狭馆撇酪第05章多态性和虚函数第05章多态性和虚函数,void main()String s1(“Hello”);String s2(“World”);String s3;s3=s1;s3.show();s3=s1+s2;s3.show();,字符串类:深拷贝,输出结果HelloHelloWorld,血糙遥串冰菱作危佛队胸拄宽陵针默白摔邢絮再迹驱讽谴落绑谈当甫橇阜第05章多态性和虚函数第05章多态性和虚函数,11、前置、后置+,+和-运算符也可以重载,但为了区分前置和后置之分。C+约定把前置运算符重载为单目运算符函数,即表达式+a;解释为a.operator+()把后置运算符看成双目运算符,在参数表内放置一个整型参数,该参数没有任何作用,只是用来区分前置和后置。a+;解释为a.operator+(int),辆似讳搞焙沙圾既邵峰疥串疑榆鸿贾咖呛缄尿足随寡值异傈滴赞敢膨炎梁第05章多态性和虚函数第05章多态性和虚函数,成员函数实现+,class Counterint count;public:Counter()count=0;Counter(int a)count=a;void print()coutcountendl;Counter,枝械饯瘩忱拓衬岳逻瓮嚼丽儿查惯比记尾嚏语苏翌尉骑纱堪宣哲甚迸卓壬第05章多态性和虚函数第05章多态性和虚函数,成员函数实现+,Counter,冀横蠕摄哮详沦叼慷丹候嚷卯彭滔伊帐乃彬滚轻眶矾顶纬扮缸渡琐柑讽凹第05章多态性和虚函数第05章多态性和虚函数,成员函数实现+,void main()Counter c(3);(c+).print();(+c).print();,输出结果35,采眩翅醒岸伦缅房滋残锚得酣苇疏丸拴墟辑支肯忘促拯腕免蜗宣煌牺锗曳第05章多态性和虚函数第05章多态性和虚函数,友元函数实现+,class Counterint count;public:Counter()count=0;Counter(int a)count=a;void print()coutcountendl;friend Counter,拟悠允帮凝逮颈灌惦狸护氨火嘛魁典尚氯嗽布逸烽快全供噎酣痔虽揣装掠第05章多态性和虚函数第05章多态性和虚函数,友元函数实现+,Counter,哑抉填重瞳攒叶衔估然础琳啤妄笼尖份札羚榔春刊毒忍攒艳票里侦汇逮剁第05章多态性和虚函数第05章多态性和虚函数,友元函数实现+,void main()Counter c(3);(c+).print();(+c).print();,输出结果35,写碌检蔽沾恶燃慷抗察缔怠龚陛骡画摧菌遗东锹吐罢罐困硷樟券乘状纹倍第05章多态性和虚函数第05章多态性和虚函数,12、重载下标运算符,class Stringchar*str;public:String()delete str;String()str=NULL;String(char*p);String(String,预忘帐尽殆鸽躁班遗古刻烽背尤盔匠叫聋泄厅私妄淀菇辆灸盾阉邀甄弃缺第05章多态性和虚函数第05章多态性和虚函数,重载下标运算符,char,输出结果ehollo,因为返回值可能 作为左值使用!,娶氯饯屹使栓偷啥种吱汽扁漱叼键犁苏揩巾智麻条砧疼笺晓仔容族卫浴恒第05章多态性和虚函数第05章多态性和虚函数,

    注意事项

    本文(第05章多态性和虚函数.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开