程序设计基础第10章(08级)

上传人:我*** 文档编号:137611025 上传时间:2020-07-10 格式:PPT 页数:39 大小:242KB
返回 下载 相关 举报
程序设计基础第10章(08级)_第1页
第1页 / 共39页
程序设计基础第10章(08级)_第2页
第2页 / 共39页
程序设计基础第10章(08级)_第3页
第3页 / 共39页
程序设计基础第10章(08级)_第4页
第4页 / 共39页
程序设计基础第10章(08级)_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《程序设计基础第10章(08级)》由会员分享,可在线阅读,更多相关《程序设计基础第10章(08级)(39页珍藏版)》请在金锄头文库上搜索。

1、0,第10章 多态性与虚函数,1. 多态性概述 2. 运算符重载 3. 虚函数 4. 纯虚函数与抽象类 5. 程序设计举例,1,10.1 多态性概述,多态性 面向对象程序设计的关键技术之一。利用多态性技术,可以调用同名函数,实现完全不同的功能 分类: (1)编译时的多态性: 通过函数的重载和运算符的重载来实现的。 (2)运行时的多态性: 是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的,2,编译时多态性函数重载,class A public: void f(int a). void f(flo

2、at b). ;,int main() A t; int a=1; float b=3.0; t.f(a); t.f(b); . ,3,10.2 运算符重载,1.重载运算符主要用于对类的对象的操作 2.重载运算符使得运算符适用的对象类型得到了拓宽 3.重载运算符可以通过创建运算符函数实现,创建operator函数格式如下: 类型 类名 : operator 操作符() 4.重载的运算符作为类的成员函数,或作为类的友元函数,4,例10.1 定义一个复数类,并重载加法运算符以适应对复数运算的要求。,#include class Complex double real, imag; public:

3、Complex(double r = 0, double i = 0): real(r), imag(i) double Real()return real; double Imag()return imag; Complex operator +(Complex ,5,Complex Complex:operator + (Complex ,6,Complex Complex:operator + (double d) / 重载复数加一个实数运算符 Complex temp; temp.real = real+d; temp.imag = imag; return temp; Complex

4、 operator = (Complex c) / 用友元重载赋值运算符 Complex temp; temp.real = c.real; temp.imag = c.imag; return temp; ,7,/ 测试主函数,int main() Complex c1(3,4),c2(5,6),c3; cout c1 = c1.Real() +i c1.Imag() endl; cout c2 = c2.Real() +i c2.Imag() endl; c3 = c1+c2; /对象(复数)加对象(复数) cout c3 = c3.Real() +i c3.Imag() endl; c3

5、 = c3+6.5; /对象(复数)加实数 cout c3 + 6.5 = c3.Real() +i c3.Imag() endl; return 0; ,8,C+中不允许重载的运算符,9,运算符重载的限制 不能改变运算符的优先级及结合性; 不能改变运算符的操作数个数; 不能创建新的运算符,只有已有的运算符可以重载; 运算符原有的含义不变; 重载的运算符函数不能带有默认参数; 注意有些运算符只能重载为成员函数;,10,10.3 虚函数,class Pet /基类 public: virtual void Speak() cout“zzz”endl; /虚函数 ; class Cat : pub

6、lic Pet /派生类 public: virtual void Speak() coutmiao!miao!endl; ; class Dog : public Pet/派生类 public: virtual void Speak() coutwang!wang!endl; ;,例 改写前面的例子,11,int main( ) Pet obj,*p1;/基类对象指针p1, 基类对象obj Dog dog1; Cat cat1; obj = dog1;/用Dog类对象给Pet类对象赋值 obj.Speak(); p1 = ,12,运行时的多态性举例(类定义同前): void main() i

7、nt i; Pet *p; Dog dog1;Cat cat1; cini; if(i=1) p=/编译时不能确定 ,13,一、虚函数的定义,定义: 在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数 语法: virtual 函数返回类型 函数名(参数表) 函数体 用途: 实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数(统一接口) 注意:在派生类中重新定义虚函数时,其函数名、参数个数、类型及返回值类型都必须相同,14,二、虚函数的使用限制,1. 通常只将基类中的public或protected成员声明为虚函数。 2. 可以通过对象名.、指针或引用调用虚

8、函数; 3.基类中声明的虚函数会自动向派生类继承,在派生类中重定义的基类虚函数仍为虚函数,同时可以省略virtual关键字。 4.如果派生中没有对基类的虚函数重新定义,则它继承基类中的虚函数。 5.不能定义虚构造函数,可以定义虚析构函数 6. 不能将虚函数声明为静态的或全局的;友元不能作为虚函数,15,class Pet /基类 public: virtual void Speak() coutzzzendl; ; class Cat : public Pet /派生类 public: void Speak() coutmiao!miao!endl; ; class Dog : public

9、Pet/派生类 public: void Speak() coutwang!wang!endl; ; void fun(Pet ,例 虚函数举例,16,int main() Pet obj; Dog dog1; Cat cat1; obj = dog1; fun(obj); fun(cat1); fun(dog1); Pet ,17,10.4 纯虚函数与抽象类,问题: 某个类的对象没有意义,如何防止用户创建此类对象? 例: class Pet public: virtual void Speak() ; 解决办法:纯虚函数,18,virtual 返回类型 函数名(参数表)=0; 例:virtu

10、al void Speak() =0; 注:一般来说,纯虚函数没有实现部分;,1.定义格式,19,2.抽象类,(1)定义 至少包含一个纯虚函数的类称为抽象类 (2)使用抽象类的要求 抽象类不能实例化 抽象类只作为基类被继承 可以定义指向抽象类的指针或引用,20,例 抽象宠物类的实现,class Pet /基类 char Name20; intAge; char Color12; public: Pet(char *,int ,char *); char* GetName() return Name; int GetAge() return Age; char* GetColor() retur

11、n Color; virtual void Speak() = 0; /纯虚函数声明 virtual void GetInfo( ) /虚函数声明 ; Pet:Pet(char *name,int age,char *color) strcpy(Name,name); Age=age; strcpy(Color,color); ,21,class Cat : public Pet /派生类Cat public: Cat(char *name,int age, char *color):Pet(name,age,color) void Speak() cout“miao!miao!”endl;

12、/具体化纯虚函数 void GetInfo( ); /重新调整虚函数的功能 ; void Cat:GetInfo() /重新调整虚函数的功能 cout The cats name : GetName()endl; cout The cats age : GetAge() endl; cout The cats color: GetColor()endl; ,22,class Dog : public Pet/派生类Dog public: Dog(char *name,int age, char *color): Pet(name,age,color) void Speak( ) cout So

13、und of speak : wang!wang!endlendl; /具体化纯虚函数 void GetInfo( ); /重新调整虚函数的功能 ; void Dog:GetInfo( ) /重新调整虚函数的功能 cout The dogs name : GetName()endl; cout The dogs age : GetAge() endl; cout The dogs color: GetColor()endl; ,23,int main() Pet*p1;/基类对象指针p1 p1 = new Cat(“MiKey”,1,“Blue”); /动态产生一个Cat类对象 p1-GetI

14、nfo(); p1-Speak(); delete p1; /撤消p1所指对象 p1 = new Dog(BenBen,2,Black); /动态产生一个Dog类对象 p1-GetInfo( ); p1-Speak( ); delete p1; /撤消p1所指对象 return 0; ,24,程序设计举例,例10.2 抽象宠物类的另一种用法 #include class Pet /宠物基类 public: virtual void Speak()=0; void ShowMe(); ; void Pet:ShowMe() cout我的声音:; Speak(); ,25,class Cat :

15、public Pet /派生类 public: virtual void Speak( ) coutmiao!miao!endl; ; class Dog : public Pet/派生类 public: virtual void Speak( ) coutwang!wang!endl; ; void main( ) Cat cat1; Dog dog1; cat1.ShowMe( ); dog1.ShowMe( ); ,26,例10.3 从Point、Circle类中抽象出基类Shape,研究抽象类和具体类的接口和实现。,/ shape.h文件 定义抽象基类Shape #ifndef SHAPE_H #define SHAPE_H #include class Shape public: virtual double Area() const return 0.0; / 纯虚函数,在派生类中重载 virtual void PrintShapeName( ) const = 0; virtual void Print( ) const = 0 ; #endif,27,/ point.h文件 定义类 Point,#ifndef POINT_H #define POINT_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号