问题 问答题


阅读下列说明、图和C++代码,回答问题1至问题3。
【说明】
已知四个类之间的关系如图2-2所示,分别对每个类的方法进行编号,例如Shape的perimeter()方法为1号,表示为1:perimeter(),Rectangle类的perimeter()为2号,表示为2:perimeter(),依此类推,其中,每个类的perimeter方法都为虚函数且方法签名相同。


【C++代码】
Triangle *tr=new Triangle();
Square *sq=new Square();
Shape *sh =tr;

【问题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主要考虑类型问题,我们只能够将子类类型的实例或引用赋值给父类类型的变量或引用。因此,赋值运算的左边一定是右边的父类或同一类型。正确的只有②和⑤。

问答题

【说明】
某学期成绩管理系统的“增、删、改数据表中的记录”对话框如图1-19所示。


图1-19对话框中共定义了6个标签、6个文本框、4个命令按钮和1个Data数据控件。其中Data数据控件是Visual Basic的标准控件。利用它能方便地创建应用程序与数据库之间的连接,并实现对数据资源的访问。【添加】(cmdAdd)按钮用于向学生成绩数据表添加一条空记录:【修改】(cmdEdit)按钮用于修改当前所显示的一条数据记录:命令按钮【删除】(cmdDelete)用于删除当前显示的一条数据记录;单击【退出】(cmdExit)按钮,系统将退出图1-19所示的对话框。
表1-13是学生成绩表结构的示例;表1-14是学生成绩表的示例。
图1-19将表1-14数据库中的记录信息显示到相应的文本框中。要在各文本框(txtStu(i),i=0,1,2,3,4,5)中显示Data数据控件所连接的数据表中的数据,必须将文本框与Data数据控件进行绑定。
表1-13 学生成绩表结构

字段名

类型

大小

  

字段名

类型

大小

班级 Text 6 语文 Integer 2(默认)
学号 Text 8 数学 Integer 2(默认)
姓名 Text 10 英语 Integer 2(默认)

                                             表1-14 学生成绩示例表

班级

学号

姓名

语文

数学

英语

A A40001 张薇 95 86 90
B B40001 谢新 67 71 81
A A40002 刘红 94 89 86
C C40001 张斌 78 88 86
【Visual Basic程序】
Private Sub Form_Load()
For i = 0 To 5
txtStu(i).Locked = True
Next i
End Sub
Private Sub cmdAdd Click()
cmdEdit.Enabled = Not cmdEdit.Enabled
(1)
For i = 0 To 5
txtStu(i) .Locked = Not txtStu(i).Locked
Next i
If cmdAdd. Caption = "添加" Then
(2)
Datal.Caption = "新记录"
cmdAdd.Caption = "保存"
cmdExit.Caption = "取消"
txtStu(0).SetFocus
Else
Datal.Recordset.Update
(3)
cmdAdd.Caption = "添加"
End If
End Sub
Private Sub cmdEdit_Click()
cmdAdd. Enabled = Not cmdAdd. Enabled
cmdDelete. Enabled = Not cmdDelete. Enabled
For i = 0 To 5
txtStu(i).Locked = Not txtStu(i).Locked
Next i
If cmdEdit.Caption = "修改" Then
Datal.Recordset.Edit
cmdEdit.Caption = "保存"
cmdExit.Caption = "取消"
Else
(4)
cmdEdit.Caption = "修改"
End If
End Sub
Private Sub cmdDelete_Click()
answer = MsgBox("确实删除该记录吗", vbYesNo + vbQuestion, "警告")
If answer = vbYes Then
Datal.Recordset.Delete
(5)
If Datal.Recordset.EOF Then
(6)
End If
End If
End Sub
Private Sub cmdExit_Click()
If cmdExit.Caption = "退出" Then
End
Else
(7)
cmdAdd. Enabled= True
cmdEdit.Enabled = True
cmdDelete. Enabled= True
For i = 0 To 5
txtStu(i).Locked = Not txtStu(i).Locked
Next i
cmdExit.Caption = "退出"
cmdAdd.Caption = "添加"
cmdEdit.Caption = "修改"
(8)
End If
End Sub
Private Sub Datal_Reposition()
Datal.Caption = "第" & (9) .AbsolutePosition + 1& "条记录"
End Sub
1. 【问题1】
请根据【说明】和图1-19的显示结果,从以下备选答案中为(1)~(9)空缺处选择正确的答案。(以下部分选项可重复选择)
【备选答案】
  • A.Datal.Refresh
  • B.Datal.Recordset.Update
  • C.Datal.Recordset
  • D.Datal.Recordset.CancelUpdate
  • E.Datal.Recordset.AddNew
  • F.Datal.Recordset.MoveNext
  • G.Datal.Recordset.MoveLast
  • H.cmdDelete.Enabled=NotcmdDelete.Enabled

单项选择题