欢迎来到天天文库
浏览记录
ID:58716155
大小:679.00 KB
页数:91页
时间:2020-10-04
《第05章多态性和虚函数ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、多态性和虚函数第05章主要内容5.2虚函数5.4运算符重载5.3纯虚函数和抽象类5.1重载与覆盖什么是多态性?在C++中通过重载、覆盖、运算符重载、虚函数等技术,使得基类和派生类中可以出现同名的成员函数。不同的成员函数被调用时表现出不同的行为,表现出很强的灵活性,称为多态性。成员函数重载成员函数覆盖虚函数运算符重载静态多态性和动态多态性静态多态性:编译时的多态性,成员函数重载、覆盖、运算符重载都属于静态多态性。编译器根据实参数据类型或对象的数据类型,在编译时就确定调用哪个函数。动态多态性:运行时
2、多态性,通过虚函数来实现。通过虚函数实现的动态多态性,在代码执行的过程中决定调用哪个函数。1、成员函数重载和覆盖重载:同一个类中,存在名称相同但“签名不同”的成员函数(函数参数类型或个数不同),编译时根据实参类型确定调用的是哪个版本的函数。覆盖:派生类和基类存在名称相同的成员函数,实现派生类方法覆盖(改造)基类方法的功能。如果要访问基类被覆盖方法,需要使用类名前缀。2、成员函数重载classInter{intnum;public:Inter(inta){num=a;}voidSetNum(int
3、a){num=a;}voidSetNum(doublea){num=int(a+0.5);}voidshow(){cout<4、Point{doublex,y;public:Point(doublei,doublej){x=i;y=j;}doublearea(){return0;}};覆盖技术classCircle:publicPoint{doubleradius;public:Circle(doublea,doubleb,doubler):Point(a,b){radius=r;}doublearea(){returnPI*radius*radius;}};覆盖技术voidmain(){Pointa(1.5,6.7);5、Circlec(1.5,6.7,2.5);cout<<“areaofa:”<area()<6、a,输出19.6349。因为指针p的数据类型是Point,根据赋值兼容性规则,p->area(),调用的是Point的成员函数,输出0。4、访问被覆盖的方法classCPoint{intx,y;public:CPoint(){x=0;y=0;}CPoint(inta,intb){x=a;y=b;}voidSet(inta,intb){x=a;y=b;}voidShow(){cout<7、adius;public:Circle(inta,intb,intr):CPoint(a,b){radius=r;}voidSet(inta,intb,intr){CPoint::Set(a,b);radius=r;}voidShow(){cout<8、Show();}间接调用基类成员函数限定调用基类成员,不好!运行结果5,3,47,5,67,8主要内容5.2虚函数5.4运算符重载5.3纯虚函数和抽象类5.1重载与覆盖1、为什么要运行时多态?classMammal{intage;doubleweight;public:Mammal(inta,doublew){age=a;weight=w;}voidShout(){cout<<“I’mamammal.”;}};为什么要运行时多态?classDog:publicMammal{public:Do
4、Point{doublex,y;public:Point(doublei,doublej){x=i;y=j;}doublearea(){return0;}};覆盖技术classCircle:publicPoint{doubleradius;public:Circle(doublea,doubleb,doubler):Point(a,b){radius=r;}doublearea(){returnPI*radius*radius;}};覆盖技术voidmain(){Pointa(1.5,6.7);
5、Circlec(1.5,6.7,2.5);cout<<“areaofa:”<area()<6、a,输出19.6349。因为指针p的数据类型是Point,根据赋值兼容性规则,p->area(),调用的是Point的成员函数,输出0。4、访问被覆盖的方法classCPoint{intx,y;public:CPoint(){x=0;y=0;}CPoint(inta,intb){x=a;y=b;}voidSet(inta,intb){x=a;y=b;}voidShow(){cout<7、adius;public:Circle(inta,intb,intr):CPoint(a,b){radius=r;}voidSet(inta,intb,intr){CPoint::Set(a,b);radius=r;}voidShow(){cout<8、Show();}间接调用基类成员函数限定调用基类成员,不好!运行结果5,3,47,5,67,8主要内容5.2虚函数5.4运算符重载5.3纯虚函数和抽象类5.1重载与覆盖1、为什么要运行时多态?classMammal{intage;doubleweight;public:Mammal(inta,doublew){age=a;weight=w;}voidShout(){cout<<“I’mamammal.”;}};为什么要运行时多态?classDog:publicMammal{public:Do
6、a,输出19.6349。因为指针p的数据类型是Point,根据赋值兼容性规则,p->area(),调用的是Point的成员函数,输出0。4、访问被覆盖的方法classCPoint{intx,y;public:CPoint(){x=0;y=0;}CPoint(inta,intb){x=a;y=b;}voidSet(inta,intb){x=a;y=b;}voidShow(){cout<7、adius;public:Circle(inta,intb,intr):CPoint(a,b){radius=r;}voidSet(inta,intb,intr){CPoint::Set(a,b);radius=r;}voidShow(){cout<8、Show();}间接调用基类成员函数限定调用基类成员,不好!运行结果5,3,47,5,67,8主要内容5.2虚函数5.4运算符重载5.3纯虚函数和抽象类5.1重载与覆盖1、为什么要运行时多态?classMammal{intage;doubleweight;public:Mammal(inta,doublew){age=a;weight=w;}voidShout(){cout<<“I’mamammal.”;}};为什么要运行时多态?classDog:publicMammal{public:Do
7、adius;public:Circle(inta,intb,intr):CPoint(a,b){radius=r;}voidSet(inta,intb,intr){CPoint::Set(a,b);radius=r;}voidShow(){cout<8、Show();}间接调用基类成员函数限定调用基类成员,不好!运行结果5,3,47,5,67,8主要内容5.2虚函数5.4运算符重载5.3纯虚函数和抽象类5.1重载与覆盖1、为什么要运行时多态?classMammal{intage;doubleweight;public:Mammal(inta,doublew){age=a;weight=w;}voidShout(){cout<<“I’mamammal.”;}};为什么要运行时多态?classDog:publicMammal{public:Do
8、Show();}间接调用基类成员函数限定调用基类成员,不好!运行结果5,3,47,5,67,8主要内容5.2虚函数5.4运算符重载5.3纯虚函数和抽象类5.1重载与覆盖1、为什么要运行时多态?classMammal{intage;doubleweight;public:Mammal(inta,doublew){age=a;weight=w;}voidShout(){cout<<“I’mamammal.”;}};为什么要运行时多态?classDog:publicMammal{public:Do
此文档下载收益归作者所有