标准C++程序设计第10章 虚函数与多态性.ppt

标准C++程序设计第10章 虚函数与多态性.ppt

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第10章 虚函数与多态性 10.1 共同的基类 10.1.1 概念中的共性 在面向对象的程序设计中,每个类都是对一种概念的描述。通常,一些概念之间存在着共性,这种共性又体现了新的概念,得到这种新概念的过程就是抽象。 class Rectangle class Circle 除了少量的特殊方法外,Rectangle与Circle有着完全相同的一组方法,只是方法实现的过程又不相同。 10.1 共同的基类(续) 10.1.2 公共基类 1. 利用公共基类完善概念关系,消除代码冗余 将所有图形元素的共性抽象出来,形成一种新的公共基类Shape,使Rectangle与Circle等由此基类派生。 重新描述的概念关系使代码得到了简化,Rectangle与Circle中的公共方法及属性被封能装在Shape中,利用继承关系消除了重复的拷贝。 2. 简单抽象中存在的问题 如何利用Shape指针访问Rectangle和Circle对象呢?这是技术上的问题,解决的方法是采用虚函数技术。 由于Shape描述的是一种抽象的概念,不应该生成对象,这是合理性的问题,解决的方法是采用抽象类技术 。 10.2 虚函数 面向对象设计中的另一个重要概念——多态性。 10.2.1 多态性、静态联编与动态联编 1. 多态性 指程序中具有相似功能的不同函数用同一个名称来实现,进而可以使用相同的方式来调用这些具有不同功能的同名函数。 面向对象的多态性可以严格地分为四类:强制多态、重载多态、参数多态和包含多态。 强制多态和重载多态统称为专用多态,而参数多态和包含多态称为通用多态。 10.2.1 多态性、静态联编与动态联编(续) 强制多态是指编译器对类型的隐式转换。 如计算表达式“3.0+2”时编译器将2由int类型转换为double类型。强制多态可以避免类型转换的麻烦,减少编译错误。 重载多态就是指利用函数重载所实现的多态。 参数多态与模板相关联。 包含多态是指具有继承关系的类族(层次)中定义于不同类中的同名成员函数的多态行为。 主要是通过虚函数来实现的。 10.2.1 多态性、静态联编与动态联编(续) 2. 静态联编与动态联编 从处理时刻看,多态可以划分为两类:编译时的多态和运行时的多态。 联编(或绑定):确定操作的具体对象的过程。 在编译连接阶段完成的联编称为静态联编(early binding)。也称为早期或先期联编。 强制多态、重载多态和参数多态都通过静态联编处理。 在程序运行阶段完成的联编称为动态联编(late binding),也称为晚期或后期联编。 包含多态是以动态联编方式处理的。 10.2.2 用虚函数实现动态联编 1. 虚函数的语法 虚函数(virtual function)是指一个类中定义的一类特殊方法,声明形式如下: virtual 函数原型; class Base { ... public: virtual void method(); //虚函数声明 }; void Base::method() //虚函数实现,无virtual关键字 { ... } 10.2.2 用虚函数实现动态联编(续) 2. 虚函数的作用 可以使指向派生类对象的基类指针(或引用)在不经类型转换的情况下直接调用派生类的方法。 见下页示例。 虚函数仅对继承关系有效,即如果基类和派生类中各自定义了相同的虚函数,系统将在运行时才确定基类指针所指向对象的类型,进而决定应该调用哪个类的方法。 class A { public: virtual void print(){ cout Base Class A.\n; } }; class B: public A //派生类 { public: virtual void print(){ cout Derived Class B.\n; } }; int main( ) { A a; B b; A* ap = a; //基类指针指向基类对象 ap-print(); //调用基类方法 ap = b; //基类指针指向派生类对象 ap-print(); //调用派生类对象 A ar = b; //基类引用绑定到派生类对象 ar.print(); //调用派生类方法 } 程序运行时的输出结果如下: Base Class A. Derived Claaa B. Derived Claaa B. 10.2.2 用虚函数实现动态联编(续) 3. 有关虚函数的说明 ⑴虚函数应在基类中声明,其特性被自动传递给派生类,故派生类中的virtual修饰可有可无。 ⑵实现虚函数关系的前提是两类之间以公有方式派生。 ⑶派生

您可能关注的文档

文档评论(0)

132****9295 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档