实现了很好的数抽象性通过继承和组合能够方便的实现模.pptVIP

实现了很好的数抽象性通过继承和组合能够方便的实现模.ppt

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实现了很好的数抽象性通过继承和组合能够方便的实现模

序 面向对象语言通过将数据和作用其上的操作封装成一种新的数据类型,实现了很好的数据抽象性 通过继承和组合能够方便的实现模块的可重用性和可扩充性 本章我们概述面向对象语言的重要概念和实现它们的方法 面向对象语言的概念 对象 类 继承性 -对象 一个对象由它的状态和操作于该状态的过程组成,状态由一组属性的值表示,过程也叫做方法或行为。 属性和方法共同形成了对象的特征。 对象封装了数据及其上的操作,它是一个独立的有约束的实体,有自己的记忆和活动。 -类 用户可以将一些属性和方法封装在自定义的类型中,这种类型就称为类。 一个类规范了类中对象的属性和方法,一个对象要想属于一个类,它必须至少应该包含该类所具有的特征,当然还可以含有其它一些特征。 -继承: -多态 多态是指基类的方法调用可以根据实际运行的对象类型不同实现对不同函数体的调用。 考虑类间的层次关系,解决功能和行为的再抽象。 单继承的编译方案 子类中属性的偏移值应该如何定? 对于单继承,即每个派生类只有一个父类的情况,采用最简单的“前置”技术就能解决上面的问题。 例如当B从A派生而来时,那些从A继承来的属性被置于B的属性域的最开始,并和它们在A中出现的顺序是相同的。那些从B派生的属性被放在后面, 单继承的编译方案 方法的编译同普通函数的编译很相似: 它被编译变换成机器代码存于指令空间的一个特定地址中。 在编译的语义分析阶段,每一个变量的环境域会包含一个指针指向它的类描述符;每个类描述符又包含一个指向它父类的指针和自身的方法实例列表;每个方法实例又包含一个对应的机器指令级的标号。 §静态方法 静态方法是指在编译时就可以确定下来执行函数体的方法。 在c++中没有特殊标明的方法都属于此类。例如下面的c++程序: class A{int x; void f();} class B:public A{ void g();} class C:public B{ void g();} class D:public C{int y; void f();} 该程序中所有的方法都是静态方法。 当我们调用一个方法c.f()时,编译出的机器代码是依据变量c的类型来定的,而不是依据c所指向的对象类型来定的,这样静态方法对应的执行函数体就可以在编译时确定下来。 为了编译类似于c.f()的方法调用,编译器首先要找到c所对应的类描述符,假设为C;接着要在C中查找方法f,假设没有找到; 然后编译器再查找C的父类B,然后在B中寻找方法f,以此类推。 假设最后在某个祖先类A中找到了静态方法f,这时编译器就可以将c.f()这个调用编译为机器标号A_f。 §动态方法 动态方法是指在编译时无法确定下来执行函数体,要到运行时根据变量指向的实际类型来确定的方法。 在c++中用带有virtual关键字的虚函数来表示。 与静态方法相反,编译出的机器代码不是依据变量的类型来定而是依据变量所指向的对象类型来定的。 对于前面的例子,类A中的方法f是一个动态方法,它在类C的子类D中被覆盖。这样当我们同样调用c.f()时,我们没有办法在编译时确定变量c指向的类型是D还是C,因而也就无法确定应该编译成机器标号D_f,还是A_f。 动态方法表(也称为虚函数表) £ 为解决动态方法在编译时无法确定应该编译成的机器标号,引 入了动态方法表,该表记录了每个动态方法对应的机器标号。 £ 当类B从类A派生出来以后,它的动态方法表首先包含A中已有的 方法,然后才是自己新增的动态方法。 根据上面属性和方法的编译方案,下面程序对应的对象实例如右图所示: 多继承的编译方案 与多继承性有关的所有问题和可能的解决办法都可以通过双继承性来阐明。 多继承性引入了许多单继承性不存在的问题,主要包括命名冲突和重复继承。 1)命名冲突:当基类B1和B2包含相同的方法名或属性名时,类C从B1和B2派生时就会引起冲突 2)重复继承:例如在图10.8中,若B1和B2都直接从类A继承,那么C将从A重复继承,也就是说C中将包含两份A的实例。 对于问题(1),它是一个语言定义的问题,与编译实现关系不大。 对于问题(2),会有两种实现,一种是允许多个基类的实例,一种是只允许一个基类的实例。 私有属性和方法的编译 ●真正的面向对象语言能够为对象的属性提供保护,防止其它对象的方法直接操作它们。 ?私有属性是指禁止从不属于该对象的函数中读取或访问的属性; ?私有方法是指不能从对象外部调用的方法。 ●不同的语言允许不同的私有性和保护,包括: ?属性和方法只能从声明它们的类中访问。 ?属性和方法只能从声明它们的类和该类的任何子类中访问。

文档评论(0)

ldj215323 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档