问答题
阅读下列说明、图和C++代码,回答问题1至问题3。
【说明】
已知四个类之间的关系如图2-2所示,分别对每个类的方法进行编号,例如Shape的perimeter()方法为1号,表示为1:perimeter(),Rectangle类的perimeter()为2号,表示为2:perimeter(),依此类推,其中,每个类的perimeter方法都为虚函数且方法签名相同。
问答题
【问题1】 关于上述C++代码中sh和tr的以下叙述中,哪两个是正确的(写出编号)。
①sh和tr分别引用同一个对象;
②sh和tr分别引用同一类型的不同的对象:
③sh和tr分别引用不同类型的不同对象;
④sh和tr分别引用同一个对象的不同备份:
⑤sh和tr所引用的内存空间是相同的。
【正确答案】
【答案解析】① ⑤
问答题
【问题2】 写出下面消息对应的方法编号(如果该消息错误或者没有对应的方法调用,请填写“无”)。
tr->height() {{U}}(1) {{/U}}
sh->perimeter() {{U}} (2) {{/U}}
sq->height() {{U}}(3) {{/U}}
sq->perimeter() {{U}} (4) {{/U}}
sh->height() {{U}}(5) {{/U}}
tr->perimeter() {{U}} (6) {{/U}}
【正确答案】
【答案解析】(1)3 (2)5 (3)无 (4)4 (5)无 (6)5
问答题
【问题3】 不考虑内存释放问题,下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)。
①sq=sh; ②sh=tr; ③tr=sq; ④sq=tr; ⑤sh=sq;
【正确答案】
【答案解析】② ⑤ [分析] 根据C++代码: Triangle *tr=new Triangle(); Square *sq=new Square(); Shape *sh=tr; 可以得出下面的结论:tr指向一个Triangle对象,sq指向一个Square对象,sh和tr指向同一个Triangle对象。下面对问题1给出的论断进行判断,①、⑤正确,由于sh和 tr指向同一个对象,因此其引用的内存空间也是相同的,不存在不同的备份。②、③和④错误。 根据题目的描述,我们知道perimeter是虚拟函数,所以所有通过sh调用的perimeter都将实际调用Triangle类的perimeter方法。 ·tr->height():因为tr指向一个Triangle对象,所以调用Triangle类的height方法。 ·sh->perimeter():因为sh指向的是一个Trangle对象,所以调用Triangle类的 perimeter方法。 ·sq->height():因为sq指向的是Square对象,但Square类并没有height方法,所以未对应任何方法调用。 ·sq->perimeter():因为sq指向的是Square对象,所以调用Square类的perimeter方法。 ·sh->height():虽然sh指向的是一个Trangle对象,sh中并未定义height方法,所以此调用错误。 ·tr->perimeter():因为tr指向一个Triangle对象,所以调用Triangle类的perimeter方法。 问题3主要考虑类型问题,我们只能够将子类类型的实例或引用赋值给父类类型的变量或引用。因此,赋值运算的左边一定是右边的父类或同一类型。正确的只有②和⑤。