1、C+面向对象程序设计(第 5版)浙江工业大学 软件学院国外经典教材 .计算机科学与技术 (美 ) Walter Savitch浙江工业大学 软件学院C+面向对象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式第 5章 多态性与虚函数5.1 多态性的概念5.2 一个典型的例子5.3 虚函数5.4 纯虚函数与抽象类浙江工业大学 软件学院C+面向对象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式5.1 多态性的概念v在 C+中,基 类 指 针 或引用可以直接引用其任何派生子 类 ,而无需程序 员 介入 这 种“用基 类 的指 针 或引用操 纵 多个 类 型 ”的能力称为 多 态
2、 ( polymorphism) 。v多 态 性 (polymorphism)是面向 对 象程序设 计 的一个重要特征。利用多 态 性可以 设计 和 实现 一个易于 扩 展的系 统 。浙江工业大学 软件学院C+面向对象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式v例如,已知基 类 Camera派生出两个子 类OrthographicCamera和 PerspectiveCamera:v已知函数:void lookAt( const Camera *pcamera );CameraPerspectiveCameraOrthographicCamera浙江工业大学 软件学院C+面向对
3、象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式v每次 lookAt()函数 调 用 时 都会 传 入一个 Camera子 类对 象的地址, 编译 器会自 动 地把它 转换 成适当的基 类 指 针 。例如:OrthographicCamera ocam;lookAt( /ok:自 动转换 成 Camera*PerspectiveCamera *pcam = new PerspectiveCamera;lookAt( pcam ); /ok:自 动 被 转换 成 Camera*vlookAt()的 实现 被屏蔽在 应 用程序的 实际Camera子 类 之外,如果以后增加或 删 除一个
4、子 类 ,无需改 变 lookAt().v子 类 多 态 性使得我 们 在 编 写 应 用程序的核心 时,可以不用考 虑 将来需要 维护 的 单 个 类 型。浙江工业大学 软件学院C+面向对象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式v从系 统实现 的角度看,多 态 性分 为 两 类 : 静 态 多 态性和 动态 多 态 性。静 态 多 态 性是通 过 函数的重 载实现的。v利用基 类 指 针 和引用, 对 抽象基 类 的 公有接口进 行 编 程。在 运行 时 刻 ,真正要引用的 类 型被解析出来,并且 调 用适当的公有接口 实 例。v多 态 性是 “一个接口,多种方法 ”。v
5、在运行 时 刻解析出被 调 用的函数, 这 个解析 过程被称 为 动态绑 定 (dynamic binding)。在C+中,通 过 虚 拟 函数机制来支持 动态绑 定。通过继 承和 动态绑 定,子 类 型多 态 性 为 面向 对 象的程序 设计 提供了基 础 。浙江工业大学 软件学院C+面向对象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式5.2 一个典型的例子v下面是一个承上启下的例子。一方面它是有关 继 承和运算符重 载 内容的 综 合 应 用的例子,通 过这 个例子可以 进 一步融会 贯 通前面所学的内容,另一方面又是作 为讨论 多 态 性的一个基 础 用例。v例 5.1:
6、先建立一个 Point(点 )类 ,包含数据成 员x,y(坐 标 点 )。以它 为 基 类 ,派生出一个 Circle(圆 )类 ,增加数据成 员 r(半径 ),再以 Circle类为 直接基类 ,派生出一个 Cylinder(圆 柱体 )类 ,再增加数据成 员 h(高 )。要求 编 写程序,重 载 运算符 “”,使之能用于 输 出以上 类对 象。浙江工业大学 软件学院C+面向对象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式v声明基 类 Point类可写出声明基 类 Point的部分如下 :#include /声明 类 Pointclass Pointpublic:Point(f
7、loat x=0,float y=0);/有默 认 参数的构造函数void setPoint(float,float); /设 置坐 标值float getX( ) const return x; /读 x坐 标float getY( ) const return y; /读 y坐 标friend ostream /重 载运算符 “”protected: /受保 护 成 员float x,y;浙江工业大学 软件学院C+面向对象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式/下面定 义 Point类 的成 员 函数/Point的构造函数Point:Point(float a,floa
8、t b) /对 x,y初始化x=a;y=b;/设 置 x和 y的坐 标值void Point:setPoint(float a,float b) /为 x,y赋 新 值x=a;y=b;/重 载 运算符 “”,使之能 输 出点的坐 标ostream return output;浙江工业大学 软件学院C+面向对象程序设计单击此处编辑母版标题样式单击此处编辑母版副标题样式v编 写 测试 程序 main函数:int main( )Point p(3.5,5.4); /建立 Point类对 象 pcoutx=p.getX( ),y=p.getY( )endl;/输 出 p的坐 标值p.setPoint(8.5,5.8); /重新 设 置 p的坐 标值coutp(new):pendl; /用重 载 运算符 “”输 出 p点坐 标v程序 编译 通 过 ,运行 结 果 为x=3.5,y=5.4p(new):8.5,5.8v测试 程序 检查 了基 类 中各函数的功能,以及运算符重载 的作用, 证 明程序是正确的。