清华C--语言程序设计:第15章-多态性PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void show() const;
private:
double x,y;
double r;
};
#endif
.
18
例子2:抽象基类的例子(3/6)
//文件circle.cpp,实现类Circle #include "circle.h" Circle::Circle(double a, double b, double c) {
第15章 多态性
.
1
讲授内容
静态绑定和动态绑定的概念 多态性的意义和作用 虚函数的定义方法 抽象基类的作用和定义方法 虚析构函数的作用和使用方法 如何在程序中实现多态性
.
2
15.1 多态性的概念(1/5)
多态性:具有继承关系的类,其对象对 同一个函数调用可以作出不同的响应
同一个函数调用——同一条函数调用语句 不同的响应——执行不同的函数
x = a; y = b; r = c; } double Circle::area() const { return PI*r*r; }
.
6
15.1 多态性的概念(5/5)
多态性有助于提高程序的可扩展性
可以把控制模块与被操作的对象分开 可以添加已定义类的新对象,并能管理该对象 可以添加新类(已有类的派生类)的新对象,并能
管理该对象
常用的程序设计方法
为具有继承关系的类定义接口(虚函数) 用链表或数组组织所有对象 用基类指针操作这些对象
.
13
15.3 抽象基类和纯虚函数(2/4)
解决方法
不实现这些接口:纯虚函数 包含纯虚函数的类:抽象基类
抽象基类不能实例化对象
形状类Shape的对象是什么?
.
14
15.3 抽象基类和纯虚函数(3/4)
纯虚函数
没有函数体的“初始化为0”的函数 //纯虚函数 virtual double area() const = 0;
main()
{
Base *bPtr, bObj;
Derived dObj;
bPtr= &bObj;//基类指针指向基类对象 bPtr->show(); //用基类指针调用成员函数,动态绑定 bPtr= &dObj;//基类指针指向基类对象 bPtr->show(); //用基类指针调用成员函数,动态绑定
#define __CIRCLE__H__
#include "shape.h"
#define PI 3.1416
class Circle :public Shape {
public:
Circle(double = 0.0, double = 0.0, double = 1.0);
double area() const;
class Shape { public:
virtual double area() const = 0; virtual void show() const = 0; };
#endif
.
17Βιβλιοθήκη 例子2:抽象基类的例子(2/6)
//文件circle.h,定义派生类Circle
#if !defined __CIRCLE__H__
.
7
15.2 虚函数
虚函数的定义
在函数原型前加上关键字virtual 如果一个函数在基类中被声明为虚函数,则
他在所有派生类中都是虚函数(包括重定义 函数)
virtual void show();
只有通过基类指针或引用调用虚函数才 能引发动态绑定
.
8
例子1:虚函数与多态性例子(1/3)
//文件base.h //定义基类 #if !defined __BASE__H__ #define __BASE__H__ #include <iostream.h>
return 0;
}
.
11
程序运行如果
I am Base's object! I am Derived's object!
.
12
15.3 抽象基类和纯虚函数(1/4)
实现多态性的前提
需要有共同的基类 需要在基类中定义共同的接口 接口要定义为虚函数
如果基类的接口没办法实现怎么办?
如形状类Shape
class Derived :public Base{ public:
void show() { cout<<"I am Derived's object!\n";
} };
#endif
.
10
例子1:虚函数与多态性例子(3/3)
//文件ex15_2.cpp //测试多重继承的类层次
#include "derived.h"
.
3
15.1 多态性的概念(2/5)
静态绑定和动态绑定
静态绑定——编译时就能确定一条函数调用 语句要调用的函数
和面向对象的思想不太相符 一条指令对应不同对象的不同操作——现实需要
.
4
15.1 多态性的概念(3/5)
静态绑定和动态绑定
动态绑定:运行时才能确定函数调用语句调 用的函数
调用对象的成员函数时(通过引用或指针),编 译器暂不确定要调用的函数
纯虚函数不需要实现
.
15
15.3 抽象基类和纯虚函数(4/4)
抽象类和具体类
包含纯虚函数的类不能实例化对象,是抽象 类
如果抽象类的派生类实现了所有基类中的纯 虚函数,则不再是抽象类
抽象类存在的意义是作为其它类的基类, 也叫抽象基类
.
16
例子2:抽象基类的例子(1/6)
//文件shape.h //定义抽象基类Shape #if !defined __SHAPE__H__ #define __SHAPE__H__ #include <iostream.h>
编译器检查被调用函数是否存在(函数名、参数 列表、返回值)
程序运行时,系统根据接收消息的对象类型来确 定要调用的函数
.
5
15.1 多态性的概念(4/5)
多态性的实现
通过基类指针或引用调用虚函数 动态绑定
多态性有助于更好地对程序进行抽象
控制模块能专注于一般性问题的处理 具体的操作交给具体的对象去做
class Base { public:
virtual void show() { cout<<"I am Base's object!\n";
} };
#endif
.
9
例子1:虚函数与多态性例子(2/3)
//文件derived.h //定义基类Derived #if !defined __DERIVED__H__ #define __DERIVED__H__ #include "base.h"