欢迎来到天天文库
浏览记录
ID:48745258
大小:363.00 KB
页数:27页
时间:2020-01-21
《第7章 多态性与虚函数.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第七章多态性与虚函数本章内容多态性概述运算符重载虚函数教学目标了解多态性的概念掌握简单运算符重载的方法掌握虚函数的定义和使用方法7.1多态性概述1.多态性的含义在C++中多态表现为同一形式的函数调用,可能调用不同的函数实现。2.多态性的表现形式参数多态:函数模板和类模板包含多态:继承了虚函数的派生类同名函数重载多态:函数重载和运算符重载强制多态:强制类型转换7.2运算符重载1.运算符函数C++将各种运算符都处理成一个特殊的函数调用。例:在程序中写:3+5系统处理成:operator+(3,5);C
2、++中预定义的多数运算符函数其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)2.运算符重载对C++的运算符函数进行重新定义,使之以同样的形式按重新定义的方式操作类的对象。7.2运算符重载3.运算符重载的规则7.2运算符重载4.实现运算符重载的两种方法将运算符函数重载为类的成员函数将运算符函数重载为类的友元函数7.2运算符重载说明:调用该函数的对象做为运算符函数的第一个参数重载二元运算符时,参数表中应有一个形参。重载一元运算符时,参数表应为空(后置++、--除外)。1)将运算符重载为类
3、的成员函数class类名{......类型名operator运算符(形参表);......};类型名类名::operator运算符(形参表){函数体}例:用成员函数重载“+”、“-”,实现两个复数的加、减运算。7.2运算符重载2)运算符函数重载为类的友员函数在类体内说明:friend类型名operator运算符(参数表);在类体外定义运算符函数的一般形式:类型名operator运算符(参数表){…}重载二元运算符时,参数表中应有两个形参。重载一元运算符时,参数表应有一个形参。以下运算符不能重载为
4、友元函数:=、()、[]、->但可以重载为成员函数说明:例1:用友员函数重载“+”、“-”,实现两个复数的加、减运算。讨论:一元运算符、二元复合赋值运算符(如:+=、-=)常常被重载为成员函数;其他二元运算符常常被重载为友元函数。在有些情况下,二元运算符不便于重载为成员函数。例:5.67+c其中,c是类complex的一个对象。将“+”重载为友元函数时,表达式将被编译程序解释为:operator+(complex(5.67),c)//正确(在complex类中应定义了相应的构造函数)。“+”重载为
5、成员函数时,则表达式被解释为:5.67.operator+(c)//错误例:用成员函数重载“+=”,实现字符串连接操作。例:用成员函数重载“+”,实现字符串连接操作。例7.13:编写程序对字符串类重载“+="运算符和"="运算符实现两个字符串的连接。7.3虚函数主要内容:什么是虚函数虚函数的作用虚函数的定义和使用规则纯虚函数和抽象类简介静态多态性可在编译期间确定的多态性。通常称为静态联编(staticbinding)。重载多态和参数多态一般是静态多态的。动态多态性在程序运行过程中,才能确定的多态性
6、。通常称为动态联编(dynamicbinding)。包含多态和强制多态一般是动态联编的。多态性的两种实现机制#includeclassBase{intx;public:Base(intx1){x=x1;}voidprint(){cout<<“x=”<7、“y=”<print();//调用哪个print函数?pa=&d;pa->print();//调用哪个print函数?}1.虚函数的引入:不用虚函数时的静态联编。输出结果:x=5x=1017#includeclassBase{intx;public:Base(intx1){x=x1;}virtualvoidprint(){cout<<“x=”<8、”;}};classDerevid:publicBase{inty;public:Derevid(intx1,inty1):Base(x1){y=y1;}voidprint(){Base::print();cout<<“y=”<print();//调用哪个print函数?pa=&d;pa->print();//调用哪个print函数?}1.虚函数的引入:通过虚函
7、“y=”<print();//调用哪个print函数?pa=&d;pa->print();//调用哪个print函数?}1.虚函数的引入:不用虚函数时的静态联编。输出结果:x=5x=1017#includeclassBase{intx;public:Base(intx1){x=x1;}virtualvoidprint(){cout<<“x=”<8、”;}};classDerevid:publicBase{inty;public:Derevid(intx1,inty1):Base(x1){y=y1;}voidprint(){Base::print();cout<<“y=”<print();//调用哪个print函数?pa=&d;pa->print();//调用哪个print函数?}1.虚函数的引入:通过虚函
8、”;}};classDerevid:publicBase{inty;public:Derevid(intx1,inty1):Base(x1){y=y1;}voidprint(){Base::print();cout<<“y=”<print();//调用哪个print函数?pa=&d;pa->print();//调用哪个print函数?}1.虚函数的引入:通过虚函
此文档下载收益归作者所有