中国高校课件下载中心 》 教学资源 》 大学文库

《C++程序设计教程》教学资源(PPT课件讲稿)第12讲 虚函数(2/2)

文档信息
资源类别:文库
文档格式:PPT
文档页数:18
文件大小:138.5KB
团购合买:点击进入团购
内容简介
一、多态性 多态性(polymorphism)
刷新页面文档预览

C++程序设计教程 第12讲:虚函数(I)

C++程序设计教程 第12讲: 虚函数(II)

多态性 多态性( polymorphism) Shape TwoDimShape ThreeDim Shape Circle Sphere Square Cube Triangle Tetrahedron

多态性  多态性(polymorphism) Shape TwoDimShape ThreeDimShape Circle Square Triangle Sphere Cube Tetrahedron

多态性的特性 利用虚函数和多态性,程序员可以处理普遍性而让执行环 境处理特殊性。 多态性提高了可扩展性:处理多态性行为的软件可用与接 攸消息的对象无关的方式编写。(利用动态联编的特性) :插件技术 抽象类为类层次结构中的各个成员定义接口。 纯虚函数没有实体 纯虚函数必须在派生类中实现。 尽管不能实例化抽象基类的对象,但却可以声明抽象基类 的指针。例:如果 Shape是抽象基类 ●不能: Shape ob; 但可以: Shape*pOb; 多态性特别适合于实现分层的软件系统

多态性的特性  利用虚函数和多态性,程序员可以处理普遍性而让执行环 境处理特殊性。  多态性提高了可扩展性:处理多态性行为的软件可用与接 收消息的对象无关的方式编写。(利用动态联编的特性) 如:插件技术  抽象类为类层次结构中的各个成员定义接口。  纯虚函数没有实体;  纯虚函数必须在派生类中实现。  尽管不能实例化抽象基类的对象,但却可以声明抽象基类 的指针。例: 如果 Shape 是抽象基类,  不能:Shape Ob;  但可以: Shape* pOb;  多态性特别适合于实现分层的软件系统

纯虚函数 例研究:工资单系统 class Employeei virtual earnings( const =0: 1 必须重载并实现 class Boss: public Emplovee I virtual earnings( const; 1 class CommissionWorker: public Employee I virtual earnings( const; 3 class PieceWorker: publI 重载函数可以各 I virtual earnings( const; 3 不相同 class HourlyWorker public Emplovee I virtual earnings( const; 3 见FG61

实例研究:工资单系统 class Employee { virtual earnings() const = 0; } class Boss : public Employee { virtual earnings() const; } class CommissionWorker : public Employee { virtual earnings() const; } class PieceWorker : public Employee { virtual earnings() const; } class HourlyWorker : public Employee { virtual earnings() const; } 纯虚函数 必须重载并实现 重载函数可以各 不相同 见FIG6_1

输出代码 Rmp1。yee*ptr;//基类指针 Boss b John"Smith"800.00) ptr=6b;//指向派生类对象的基类指针 ptr->printo)i /动态绑定 cout earnings()i /动态绑定 b printo)i //静态绑定 cout< Wearned郭″<<b, earnings); /静态绑定

输出代码  Employee* ptr; // 基类指针  Boss b ( “John”,”Smith”,800.00);  ptr = &b; // 指向派生类对象的基类指针  ptr->print(); // 动态绑定  cout earnings(); // 动态绑定  b.print(); // 静态绑定  cout << “earned $” << b.earnings(); // 静态绑定

class Shape virtual float areao return 0.0: 1 虚函数 virtual float volume( freturn 0.0, 1 virtual void print ShapeName(=0; 纯虚函数 class Point: public Shape virtual void print ShapeNameo class Circle: public Point 实例 virtual float areao 研究 virtual void print ShapeNameo class Cylinder public Circle virtual float areao virtual float volume; virtual void print ShapeNameo

class Shape 实例研究 virtual float area() {return 0.0;} virtual float volume() {return 0.0;} virtual void printShapeName()=0; class Point : public Shape virtual void printShapeName(); class Circle : public Point virtual float area() ; virtual void printShapeName(); class Cylinder : public Circle virtual float area() ; virtual float volume() ; virtual void printShapeName(); 虚函数 纯虚函数 实 例 研 究

新类和动态绑定 动态绑定:允许向系统中添加新类。编译时可以 不必知道对象的类型。在运行时,虚函数调用和 被调用对象的成员函数匹配。 屏幕管理程序可以不经过重新编译就可以处理新 的显示对象。 Circle: Draw( 屏幕管理程序 Square: Draw List[i]->Draw()i Triangle: Draw Rectangle:Draw0←ew 采霈新鳊

 动态绑定:允许向系统中添加新类。编译时可以 不必知道对象的类型。在运行时,虚函数调用和 被调用对象的成员函数匹配。  屏幕管理程序可以不经过重新编译就可以处理新 的显示对象。 新类和动态绑定 Circle:Draw() Square:Draw() Triangle:Draw() List[i]->Draw(); 屏幕管理程序 Rectangle:Draw() new! 不需重新编译!

C+是如何实现动态绑定的 在运行时,每一个包含虚函数的类都有一个虚函 数表vtab1e: Shape Draw( TwoDim Draw( Circle: Draw next next null 利用这个 vtable实现动态联编,从而实现多态 性 从运行效率来说,多态性和 switch语句编的程 序具有同样的效率

 在运行时,每一个包含虚函数的类都有一个虚函 数表 vtable:  利用这个vtable实现动态联编,从而实现多态 性。  从运行效率来说,多态性和switch语句编的程 序具有同样的效率。 C++是如何实现动态绑定的 Shape:Draw() next TwoDim:Draw() next Circle:Draw() null

多态性在链表设计中的应用 多态性( polymorphism) 通过继承而相关的不同的类,他们的对象能 够对同一个函数调用作出不同的响应 Circle: Draw(O virtual Shape: Draw Square: DrawL Triangle Draw( 形式相 同而实 质不同 for int i=0; iDraw)i

多态性在链表设计中的应用  多态性(polymorphism)  通过继承而相关的不同的类,他们的对象能 够对同一个函数调用作出不同的响应。 virtual Shape:Draw() Circle:Draw() Square:Draw() Triangle:Draw() for ( int i=0; i Draw(); 形式相 同而实 质不同!

数组和链表 数组( Array)是固定大小的。 如: int array[10]; 链表(工st)的大小不固定,它是由一个个结点组 成。每个结点由数据和指向下一个结点的指针组成, 如 struct listnode int data; listnode *next j NULL data data data data next|text凵text_」「 next

数组和链表  数组(Array)是固定大小的。  如: int array[10];  链表(List)的大小不固定,它是由一个个结点组 成。每个结点由数据和指向下一个结点的指针组成, 如:  struct listnode  { int data; listnode *next; } data *next & data *next & data *next & data *next & NULL

共18页,试读已结束,阅读完整版请下载
刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档