【答案解析】[解析] 解答此类试题的一般思路是掌握类的各种继承方式以及它们的访问权限。
面向对象技术解决软件复用的途径之一是采用继承机制。在继承关系中存在着基类和派生类两种类型,访问控制方式主要有public(公有派生)、protected(保护派生)和private(私有派生)。基类中成员的访问权限在派生类中的继承关系如表1-10所示。
表1-10 访问权限的继承关系表 派生性质 | 在基类中的访问权限 | 在派生类中的访问权限 |
Public (公有派生) | public | public |
| protected | protected |
| private | 不可访问 |
Protected (保护派生) | public | protected |
| protected | protected |
| private | 不可访问 |
Private (私有派生) | public | private |
| protected | private |
| private | 不可访问 |
根据试题中相关描述以及“class P:protected O{…};”和“class Q:public O{…};”语句,结合表1-10的继承关系可知,类P、Q的成员函数及其访问控制如表1-11所示。
表1-11 类P、Q的成员函数及其访问控制表 | 类名 | 成员函数 | 访问控制 | 类名 | 成员函数 | 访问控制 |
| P | F1 | private | Q | F1 | private |
| F2 | protected | F2 | public |
| F3 | protected | F3 | protected |
由试题的关健信息“类O中定义了一个私有方法F1”可知,方法F1是基类O的private(私有)成员。同时通过表1-10可知,类P、Q继承了F1方法,但其访问权限是private,结合表1-9最后一行的继承关系可得,只有在基类O的内部成员才能访问方法F1,而派生类P、Q的内部成员是不可访问方法F1的。因此问题(58)的正确答案是选项B。
由于方法F2是基类O中定义的一个公有方法,由此可知基类O的对象可以访问方法F2,因此问题(59)选项D的描述是错误的。
通过表1-10可知,类Q继承了F2方法,其访问权限也是public,因此派生类Q的对象可以访问方法F2。
在表1-10中类P对方法F2的访问权限是protected,结合表1-9第4行的继承关系可得,派生类P的对象是不可访问方法F2的,只有在派生类P的的内部成员才可以访问方法F2。因此问题(59)的正确答案是选项C。
同理,由于方法F2是基类O中定义的一个受保护的方法,通过表1-10可知,派生类P、Q对F3方法的访问权限均是protected,结合表1-9第5行的继承关系可得,基类O和派生类P、Q的对象都不能可访问方法F3,只有在类O、P、Q的内部成员才可以访问方法F3。因此问题(60)的正确答案是选项B。