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