【答案解析】本题考查C++语言中类(Class)的相关概念。
类是为某种类型的对象定义变量和方法的原型,它表示对现实生活中一类具有共同特征事物的抽象,是面向对象编程的基础。
类是对某个对象的定义,包括对象动作的名称、方法、属性和事件。当引用类的代码运行时,类的一个新的实例,即对象在内存中创建。虽然只有一个类,但可通过它在内存中创建多个相同类型的对象。类创建的所有对象都有相同的成员,即属性、方法和事件。但是每个对象都如同一个独立的实体一样动作,一个对象的属性可以设置成与同类型的其他对象不同的值。
类定义的一般形式如下:
class Name {
public:
类的公有接口
private:
私有的成员函数
私有的数据成员定义
};
类的定义由类头和类体两个部分组成,类头由关键字Class开头,然后是类名,其命名规则与一般标识符的命名规则一致;类体包括所有的细节,并放在一对花括号中。类的定义也是一个语句,所以要以分号结尾;否则会产生编译错误。
类体定义类的成员,它支持如下两种类型的成员。
(1) 数据成员:指定该类对象的内部表示。
(2) 成员函数:指定该类的操作。
类成员有如下3种不同的访问权限。
(1) 公有(Public)成员:可以在类外和子类中访问。
(2) 私有(Private)成员:只能被该类的成员函数访问,在子类中和外部不能被访问。
(3) 保护(Protected)成员:只能被该类的成员函数或派生类的成员函数访问,在外部不能被访问。
类成员的访问权限如表6-2所示。
表6-2 类成员的访问权限 成员 | 类的成员函数(内部) | 类的对象(外部) | Public | 可以访问 | 可以访问 | Protected | 可以访问 | 不可以访问 | Private | 可以访问 | 不可以访问 | |
数据成员通常是私有的;成员函数通常有一部分是公有的,一部分是私有的。公有函数可以在类外被访问,也称为“类的接口”。可以为各个数据成员和成员函数指定合适的访问权限。 派生类有如下3种继承方式,即公有继承(Public)、私有继承(Private)和保护继承(Protected)。 (1) 公有继承 ·基类成员对派生类的可见性:对派生类来说,基类的公有成员和保护成员可见:基类的公有成员和保护成员作为派生类的成员时保持原有的状态:基类的私有成员不可见:基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。 ·基类成员对派生类对象的可见性:对派生类对象来说,基类的公有成员是可见的,其他成员不可见。 所以在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。 (2) 私有继承 ·基类成员对派生类的可见性:对派生类来说,基类的公有成员和保护成员可见:基类的公有成员和保护成员均作为派生类的私有成员,并且不能被这个派生类的子类所访问:基类的私有成员不可见,派生类不可访问基类中的私有成员。 ·基类成员对派生类对象的可见性:对派生类对象来说,基类的所有成员均不可见。 所以在私有继承时,基类的成员只能由直接派生类访问,而无法向下继承。 (3) 保护继承 这种继承方式与私有继承方式的情况相同,区别仅在于对派生类的成员而言。 ·基类成员对派生类的可见性:对派生类来说,基类的公有成员和保护成员可见:基类的公有成员和保护成员均作为派生类的保护成员,并且不能被这个派生类的子类所访问;基类的私有成员不可见:派生类不可访问基类中的私有成员。 ·基类成员对派生类对象的可见性:对派生类对象来说,基类的所有成员均不可见。 所以在保护继承时,基类的成员也只能由直接派生类访问,而无法向下继承。 基本成员在派生类的各种继承方式下,基类成员对派生类和派生类对象的可见性关系如表6-3所示。
表6-3 派生类各种继承方式下的可见性关系 基本成员 | 派生类的继承方式 | 对派生类 | 对派生类的对象 | | Public | 可见,相当于Public成员 | 可见 | Public | Protected | 可见,相当于Protected成员 | 不可见 | Private | 可见,相当于Private成员 | 不可见 | | Public | 可见,相当于Protected成员 | 不可见 | Protected | Protected | 可见,相当于Protected成员 | 不可见 | Private | 可见,相当于Private成员 | 不可见 | | Public | 不可见 | 不可见 | Private | Protected | 不可见 | 不可见 | Private | 不可见 | 不可见 | |
由此可见,子类无沦采用何种继承方式都不能访问基类中Private属性的成员。采用Public继承,基类中的Public及Protected属性的成员访问特性在子类中仍然保持一致;采用Protected继承,基类中的Public及Protected属性成员访问特性在子类中变为Protected;采用Private继承,基类中的Public及Protected属性成员访问特性在子类中变为Private.。
本题中F1是私有方法,仅在本类中才可被访问,其他所有类没有权限访问它。
F2是类O的共有方法,所以类O的对象肯定可以访问F2;由于类P采用Protected方式从类O继承,因此F2方法在类P中将变成Protected保护级别,类P的对象无法访问F2;类Q采用Public方式从类O继承,因此F2方法在类Q中仍然保持Public保护级别,类Q的对象可以访问F2方法。
F3是类O的保护方法,所以类O的对象肯定无法访问F3;类P采用Protected方式从类O继承,因此F3方法在类P中仍然是Protected保护级别,类P的对象无法访问F3;类Q采用Public方式从类O继承,因此F3方法在类Q中仍然保持Protected保护级别,类Q的对象也无法访问F3。