zdq第11章-多态

合集下载

计算机科学导论第11章参考答案

计算机科学导论第11章参考答案

CHAPTER 11Data StructuresReview Questions1.We need data structures to hold a collection of related variables so that we cansolve complex problems more efficiently.3.An array is a fixed-size sequenced collection of elements of the same data type.5.Elements of an array are contiguous in memory and can be accessed by use of anindex. Elements of a linked list are stored in nodes that may be scattered through-out memory and can only be accessed via the access functions for the list (i.e., aspecific node is returned by a search function).7.A frequency array shows the number of elements with the same value found in aparticular collection of data.9.An array is stored contiguously in memory. A two-dimensional array uses row-major storage in which the array is essentially stored as an array of arrays.11.The fields of a node in a linked list are the data itself and a pointer (address) to thenext node in the list.13.The head pointer contains the address of the first node in the list.15.A singly linked list is a linked list in which each node contains only one pointerthat contains the address of the following node. There are multi-linked lists inwhich each node contains more than one pointer, allowing for much more complexdata structures.Multiple-Choice Questions17.d19.d21.b23.d25.c27.b29.d34CHAPTER 11DATA STRUCTURES31.a33.a35.bExercises37.CompareInput: Two arrays (A and B) of 10 integers1. Set Index equal to 02. While Index is less than 102.1 If A [Index] is not equal to B [Index]2.1.1 Return falseEnd if2.2 Increment IndexEnd loop3. Return trueEnd39.PrintInput: An array (A), the number of rows (I), and the number columns (J)1. Set RowIndex equal to 02. Set ColIndex equal to 03. While RowIndex is less than I3.1 While ColIndex is less than J3.1.1 Print A [RowIndex][ColIndex]3.1.2 Increment ColIndexEnd loop3.2 Move to next line in output3.3 Increment RowIndexEnd loopEnd41.AddFractionsInput: Two fractions (Fr1 and Fr2)1. Allocate new fraction object (Fr3)2. Set Fr3.denominator equal to Fr1.denominator * Fr2.denominator3. Set Fr3.numerator equal to (Fr1.numerator * Fr2.denominator) +(Fr2.numerator *Fr1.denominator)4. Return Fr3EndSECTION 543.MultiplyFractionsInput: Two fractions (Fr1 and Fr2)1. Allocate new fraction object (Fr3)2. Set Fr3.denominator equal to Fr1.denominator * Fr2.denominator3. Set Fr3.numerator equal to Fr1.numerator * Fr2.numerator4. Return Fr3End45.See Figure 11.1Figure 11.1Exercise 4547.When an element is to be added to the array, a new array must be allocated and allof the old elements and the new element must be moved to the new array.49.Adding an element to a linked list is easier because a linked list does not have to betotally reallocated.51.Accessing an element of an array is easier because an index can be used.53.Sorting an array is easier because the elements can just be swapped rather thanhaving to redirect up to four different pointers.6CHAPTER 11DATA STRUCTURESSECTION 78CHAPTER 11DATA STRUCTURES。

编译原理第六章到第十一章课后习题答案

编译原理第六章到第十一章课后习题答案

编译原理第六章到第十一章课后习题答案p116/1.已知文法G[S]为:S→a|∧|(T)T→T,S|S(1) 计算FIRSTVT -- LASTVT表(2) 构造算符优先关系表(OPERATER PRIORITY RELATION TABLE),说明是否为算符优先文法。

=: #=#, (=)<: (< FIRSTVT(T) , ,<firstvt(s)<="" ,="" p="">>:LASTVT(S)># , LASTVT(T)>), LASTVT(T)> ,表中无多重人口所以是算符优先(OPG)文法。

(3)计算G[S]的优先函数。

收敛(4)对输入串(a,a)#的算符优先分析过程为Success!3.有文法G(S):s->Vv->T/ViTT->F/T+FF->)V*|((1)(+(i(的规范推导S=>V=>ViT=>ViF=>Vi(=>Ti(=>T+Fi(=>T+(i(=>F+(i(=>(+(i((2)F+Fi(的短语、句柄、素短语。

短语S: F+Fi(T1:F+F (素短语)T2:F (句柄)F:( (素短语)(3) G(S)是否为OPG?若是,给出(1)中句子的分析过程!S’->#S# S->V V->T/ViT T->F/T+F F->)V*|(算符优先关系表(OPERATER PRIORITY RELATION TABLE)对输入串(+(I(的算符优先分析过程为:p152/2文法:S→L.L|LL→LB|BB→0|1拓广文法为G′,增加产生式S′→SI3若产生式排序为:0 S' →S1 S →L.L2 S →L3 L →LB4 L →B5 B →06 B →1由产生式知:First (S' ) = {0,1}First (S ) = {0,1}First (L ) = {0,1}First (B ) = {0,1}Follow(S' ) = {#}Follow(S ) = {#}Follow(L ) = {.,0,1,#}Follow(B ) = {.,0,1,#}G′的LR(0)项目集族及识别活前缀的DFA如下图所示:I5B →.0和B →.1为移进项目,S →L.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

11C++多态

11C++多态

腐化的代码
}
2013-12-16
escape(b);//消息:危险来了。这里把函数调用看作消息 escape(m); escape(s);
10
软件的职责

每一个软件模块都有三个职责 – 软件运行起来所应完成的功能 – 软件应能应对变化 – 软件能和阅读它的人进行沟通。即对模块不熟悉
的开发人员应该比较容易阅读并理解
Animal
+:void behavor
虚函数
Bird
2013-12-16
Monkey
+:void behavor
Snake
+:void behavor
Hippopotamus
+:void behavor
19
+:void behavor
void escape(Animal & i)//使用基类接口 { i.behavor(); }
象程序设计
——《C++编程思想》
2013-12-16
5
主要内容



多态能解决什么? 多态实现的基础 多态的概念、语法 –虚函数的声明、定义 –虚析构函数 多态的实现 –虚函数表VTable –指向虚函数表的指针VPTR 多态的应用
6
2013-12-16
重点和难点

多态对程序可扩展性的提高(重点)
20
虚函数

虚函数是实现动态联编的基础
虚函数是在基类中声明为virtual,并在派生类 中被重新定义的成员函数
当基类成员函数被声明为virtual,编译器将该 函数的联编推迟到程序运行后进行 声明格式:
– virtual <返回值类型> <函数名> (<参数表>);

最新2018年上半年软件设计师真题+答案解析上午选择+下午案例完整版(全国计算机软考)

最新2018年上半年软件设计师真题+答案解析上午选择+下午案例完整版(全国计算机软考)

2018年上半年软件设计师真题+答案解析上午选择1、对有n个结点、e条边且采用数组表示法(即邻接矩阵存储)的无向图进行深度优先遍历,时间复杂度为(1)。

A. O(n2)B. O(e2)C. O(n+e)D. O(n*e)答案:A在邻接表中,就是要依次访问每个顶点,然后在每个顶点中依次访问每条边,把这些边的终点的入度+1。

也就是每个顶点和每条边依次要各访问一遍,所以时间复杂度是O(n+e)。

在邻接矩阵中,算法需要遍历邻接矩阵的每一个点,而邻接矩阵有n*n个点,所以时间复杂度是O(n*n)。

2、浮点数的表示分为阶和尾数两部分。

两个浮点数相加时,需要先对阶,即()(n为阶差的绝对值)。

A. 将大阶向小阶对齐,同时将尾数左移n位B. 将大阶向小阶对齐,同时将尾数右移n位C. 将小阶向大阶对齐,同时将尾数左移n位D. 将小阶向大阶对齐,同时将尾数右移n位答案:D对阶时,小数向大数看齐;对阶是通过较小数的尾数右移实现的。

3、计算机运行过程中,遇到突发率件,要求CPU暂时停止正在运行的程序,转去为突发事件服务,服务完毕,再自动返回原程序继续执行,这个过程称为(3),其处理过程中保存现场的目的是(4)。

A. 阻塞B. 中断C. 动态绑定D. 静态绑定答案:B4、 A. 防止丢失数据B. 防止对其他部件造成影响C. 返回去维续执行原程序D. 为中断处理程序提供数据答案:C中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

5、海明码是一种纠错码,其方法是为需要校验的数据位增加若干校验位,使得校验位的值决定于某些被校位的数据,当被校数据出错时,可根据校验位的值的变化找到出错位,从而纠正错误。

对于32位的数据,至少需要加(5)个校验位才能构成海明码。

以10位数据为例,其海明码表示为D9D8D7D6D5D4P4D3D2D1P3D0P2P1中,其中Di(0≤i≤9)表示数据位,Pj(1 ≤j≤4)表示校验位,数据位D9由P4、P3和P2进行校验(从右至左D9的位序为14,即等于8+4+2,因此用第8位的P4、第4位的P3和第2位的P2校验),数据位D5由(6)进行校验。

第7章 面向对象学习方法学

第7章 面向对象学习方法学

第七章面向对象学习方法学面向对象方法学的出发点和基本原则,是尽可能按照人类的习惯思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题域空间与实现解法的解空间在结构上尽可能一致.与传统的结构化方法相比,使用面向对象方法开发的软件,其稳定性,可修改性和可重用性都比较好.本章内容主要包括:传统方法学的缺点,面向对象的基本概念,面向对象模型.7.1 基础知识7.1.1 传统方法学的缺点结构化几其他方法学的本质,是在具体的软件开发之前,通过需求分析预先定义软件需求.然后一个一个阶段地开发用户所需要的软件,实现预先定义的软件需要.过去的经验需要告诉我们,结构化及其他方法学并不能完全消除软件危机.结构化及其他方法学仍然有许多不足之处.1.问题的表现1)生产效率低在生命周期方法学中,特别重视软件开发的阶段性.为了提高了软件开发的效率,减少重大返工次数,强调必须早每个阶段结束之前进行评估.从而开发过程中实行严格的质量管理,确实提高了许多软件的开发的成功率.但是,时间表明,开发高利率仍然很有用.2)不能满足用户需要实践表明,在开发需要模糊或需求动态变化的系统时,软件系统的结果往往不能满足用户需求的变化.主要表现在两个方面:一种是开发人员不能完全获得彻底理解用户的需要,以至开发的软件系统与用户预期的系统不一致;另一种表现是,所开发的系统不能适应用户需求变化,系统的稳定性和可扩充性不能满足需要.3)软件服用就是将已有的软件成分用于构造新的软见系统.软件复用是节约人力,提高软件效率的重要途径.结构分析.设计,几乎每一次开发一个系统时都需要针对这个具体的系统做大量的重复劳动..思维成果的可复用性差.4)软件很难维护实践经验告诉我们,即使是用生命周期方法学开发出来的软件,维护起来仍然相当困难,软件维护成本很高.2.问题的原因1)结构化技术本身的问题结构分析和设计技术的基本思想是从目标系统整体功能的单个处理着手,自顶向下不断的把复杂的处理分解为子处理,一层一层的分解下去,直到剩下若干个容易实现的子处理为止。

多态的深入理解

多态的深入理解

多态的深⼊理解对于Java的多态概念的理解 在学习Java的过程中,我们⽆论如何也绕不过多态这个东西。

它到底是个什么东西呢? 其实,它就是指调⽤相同名字的⽅法,但是得到的结果是不同的。

第⼀:对象是⽅法 多态的作⽤范围是⽅法,不是类不是对象,也不是对象⾥⾯的属性第⼆:多态产⽣的条件 1、有继承---在⼦类中有⽅法重写---在⽅法的调⽤中,有指向⼦类的⽗类的引⽤ 2、有⽅法的重载,就是相同⽅法名,但参数不同(个数,类型,顺序)第三:为什么需要多态? 因为真实世界中的情况是纷繁复杂的,为了应对⽣活中的种种情况,我们就需要程序能够分别应对各种情况。

即增加了程序的灵活性,来满⾜客户需求。

第四:Java运⾏时的多态性 运⾏时多态性或动态⽅法分派是⼀个过程,它对重写⽅法的调⽤在运⾏时体现⽽不是编译时。

在此过程中,通过超类的引⽤变量调⽤重写的⽅法。

要调⽤的⽅法基于引⽤的对象。

了解运⾏时多态性之前,让我们先来向上转换。

向上转换 当⽗类的引⽤变量引⽤⼦类的对象时,称为向上转换。

例如:class A{}class B extends A{}A a=new B(); //向上转换...Java运⾏时多态性⽰例1在这个例⼦中,我们创建两个类:Bike和Splendar。

Splendar类扩展Bike类并覆盖其run()⽅法。

通过⽗类(Bike)的引⽤变量调⽤run⽅法。

因为它引⽤⼦类对象,并且⼦类⽅法覆盖⽗类⽅法,⼦类⽅法在运⾏时被调⽤。

因为⽅法调⽤是由JVM不是编译器决定的,所以它被称为运⾏时多态性。

class Bike {void run() {System.out.println("running");}}class Splender extends Bike {void run() {System.out.println("running safely with 60km");}public static void main(String args[]) {Bike b = new Splender();// upcasting - 向上转换b.run();}}执⾏上⾯代码得到以下结果 -running safely with 60km.Java运⾏时多态性⽰例2:Bank考虑⼀种情况,Bank类是⼀个提供获得利率的⽅法的类。

第八章 继承与多态习题(C++)

第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。

(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。

如果强制转换则要注意(6)。

答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。

公有派生可以使其类的(4),所以公有派生是主流。

答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.3 利用继承能够实现(1)。

这种实现缩短了程序开发的时间,VC++中的(2)很好地体现了这一点。

答案:(1)代码的复用(2)MFC编程8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。

继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。

答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.5 C++中多态性包括两种多态性:(1)和(2)。

前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。

答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和(3)完全一样就认为是虚函数,而不必再加关键字(4)。

如有任何不同,则认为是(5)而不是虚函数。

除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。

答案:(1)同虚函数名(2)同参数表(3)同返回类型。

如基类中返回基类指针,而派生类中返回派生类指针是允许的(4)virtual(5)重载(6)静态成员函数(7)内联函数(8)构造函数8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质是将指向函数体的指针定为(3)。

chapter twelve 多态


量或引用,使该指针指向不同的派生类的 对象,并通过 调用指针所指的虚函数才能实现动态的多态性。
本章小 结

多态:
同样的消息被不同类型的对象接收时导致完
全不同的行为,是对类的特定成员函数的再 抽象。
一个函数一旦被说明为虚函数 ,则无论说明它的类被继承了多少层,在每一层派
生类中该函数都保持virtual特性。因此,在派生类中
重新定义该函数时,不再需要关键字virtual。
但习惯上,为了提高程序的可读性,常常在每层派生类 中都重复地使用virtual关键字。
void test(Base & b) {int i=1; b.fn(i);
才确定将要调用的函数。
8.3虚函 数



虚函数是动态联编的基础。 是非静态的成员函数。 在类的声明中,在函数原型之前写virtual。 virtual 只用来说明类声明中的原型,不能用在 函数实现时。 具有继承性,基类中声明了虚函数,派生类中 无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。
静态:编译时的多态
虚函数----动态:运行时的多态
静态联编与 动态联编

联编:
程序自身彼此关联的过程,确定程序中的操
作调用与执行该操作的代码间的关系。

静态联编(静态束定)
名来限定要调用的函数。
例Leabharlann 联编工作出现在编译阶段,用对象名或者类

动态联编

联编工作在程序运行时执行,在程序运行时
class Base
{public: virtual void fn(int x)

Java第五章--继承与多态


CH5 继承与多态
接口(Interface)
又称界面,用来实现类间多重继承功能的结构 其中定义了若干抽象方法和常量,形成了实现 某组功能的属性集合 接口不能直接继承,需要由类具体定义抽象 方法,称为“实现”。
CH5 继承与多态
实现接口
声明类时,用implements声明要实现的接口 类在实现指定接口的抽象方法时,必须使用完全 相同的方法头(返回值、参数列表等) 接口的抽象方法的访问控制符已指定为public, 类实现时必须显式地使用public
CH5 继承与多态
多态的概念
一般是指一个程序中同名的不同方法共存的情况。 方法覆盖 (Overload)
多态的实现
方法重载 (Override)
对象引用
CH5 继承与多态
构造函数的重载
创建类的对象时进行初始化工作; 类定义时可以根据需要定义多个构造函数。 构造函数的重载就是同一个类中存在着若干个 具有不同参数列表的构造函数。
如果子类没有定义构造函数,创建子类对象时 将调用父类无参数的构造函数; 创建子类对象时,先执行父类无参数的构造函 数,再执行子类自己的构造函数; 子类使用super调用父类的构造函数,调用语 句必须是子类构造函数的第一个可执行语句。
CH5 继承与多态
对象初始化的过 程
1、静态初始化运行 2、为对象分配内存空间,得到缺省值
CH5 继承与多态
包的定位(CLASSPATH)
类似操作系统的PATH,指明了查找包的路径:
以classpath包含的一个或多个目录作为起始目录, 查找包目录,并在找到的包目录下查找类文件。
JDK1.3以上的版本,引用java.*等系统包不需 要设置; 不设置时,默认为当前目录,但设置时,一定 要写成“.;d:/temp;……”

面向对象分析与设计(第二版)习题答案

面向对象分析与设计(第二版)习题答案第一章:面向对象基础知识1.1 什么是面向对象分析和设计?面向对象分析和设计(Object-Oriented Analysis and Design,OOAD)是软件工程中一种常用的方法论,通过将问题领域进行建模,通过对象、类、继承、封装等概念来描述现实世界中的实体、关系和行为。

面向对象分析和设计的目标是开发出可复用、可维护、可扩展、高质量的软件系统。

1.2 面向对象分析和设计的优势有哪些?面向对象分析和设计有以下优势: - 高度模块化:通过将系统划分为多个独立的对象,便于理解和设计系统的各个部分。

- 可复用性:面向对象设计强调对象的复用,通过定义通用的类和接口,可以提高代码的复用程度。

- 可维护性:面向对象的封装特性使得系统的各个部分具有独立性,便于维护和修改。

- 可扩展性:通过继承和多态等特性,可以方便地扩展和修改系统的功能。

- 高可靠性:面向对象的封装和隐藏特性可以减少系统中的错误和安全漏洞。

- 开发效率高:面向对象的分析和设计提供了一种更自然的思考和描述问题的方法,可以提高开发效率。

第二章:面向对象建模2.1 对象的特征有哪些?对象具有以下特征: - 状态(State):对象的状态是对象的属性值的集合,表示对象的某个时刻的状态。

- 行为(Behavior):对象可以执行的操作,描述了对象能够做什么。

- 身份(Identity):每个对象都有唯一的身份,可以通过身份来区分不同的对象。

2.2 类和对象之间的关系有哪些?类和对象之间有以下关系: - 实例化(Instantiation):类是对象的模板,对象是类的一个具体实例。

- 继承(Inheritance):一个类可以继承另一个类的属性和方法。

- 聚合(Aggregation):一个类可以包含其他类的对象作为成员变量。

- 关联(Association):两个类之间存在某种关系,一个类的对象可以访问另一个类的对象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
集美大学机械学院—郑东强
1、多态例子-使用多次定义
void fn(Student& s) //对于每个重名成员,分基类和派生类分别定义 { s.display(); } void fn(GraduateStudent& g) //如果不分别定义,将都调用基类的 { g.display(); } int main() { Student ds("张三"); GraduateStudent gs("李四","王教授"); ds.addHours(20); fn(ds); fn(gs); return 0; }
集美大学机械学院—郑东强
1、多态例子-派生类
class GraduateStudent: public Student { string tutor; public: GraduateStudent ( string pN="noName", string tN="noName"): Student(pN), tutor(tN) { } void display( ) {addHours(1); Student::display(); //调用基类成员函数 cout<<"导师:"<<tutor<<endl; return; } };
《C++程序设计》
第11章-多态
集美大学机械ห้องสมุดไป่ตู้院—郑东强
主要内容
一. 多态的例子
集美大学机械学院—郑东强
多态
由于继承带来类名空间中名的重复,而每次
指定某个重名函数所属的派生类级别给编程 带来麻烦,使用多态则可以把区分所属派生 类级别的任务交给编译系统。
集美大学机械学院—郑东强
1、多态例子-基类
集美大学机械学院—郑东强
1、多态例子-使用虚函数
class Student { …… virtual void display(); …… }; class GraduateStudent: public Student {…… virtual void display( ); ……}; void fn(Student& s) //只需定义基类,派生的就不必定义了 { s.display(); }
class Student { string name; int creditHours; public: Student(string pName="noName") { name=pName; creditHours=0; } void addHours(int hours) { creditHours+=hours; return; } void display() { cout<<"姓名:"<<name<<",学分:"<< creditHours<<endl; } };
集美大学机械学院—郑东强
相关文档
最新文档