104虚基类 在多重继承过程中,可能发生在最终的派生类中存在某一个基 类的多个副本的现象。比如,“大学生”类和“职工”类均可 以从“人”类派生出来,“职工大学生”又可以通过从“大学 生”类和“职工”类多重继承而来。但这个最终类中存在两个 “人”类的副本。如下图所示 Name PersonaGe Person Person uSex Student dEpartment sPeciality Student orker N ame Person UAge uSex Worker Work Stul dEpartment Job
10.4 虚基类 在多重继承过程中,可能发生在最终的派生类中存在某一个基 类的多个副本的现象。比如,“大学生”类和“职工”类均可 以从“人”类派生出来,“职工大学生”又可以通过从“大学 生”类和“职工”类多重继承而来。但这个最终类中存在两个 “人”类的副本。如下图所示。 Person Person Student Worker Work_Stu Person Person Student Worker pName uAge uSex pName uAge uSex pDepartment pDepartment pSpeciality pJob
从上图可见,类中存在某一基类的多个副本不仅浪费了存储 空间,而且导致二义性。更为严重的是为了保持多个副本中 数据成员值的同步,将使操作变得极为复杂 若欲保证派生类中仅有所有基类的一个副本,则应将其所有 基类说明为虚基类。说明虚基类的一般形式为: class derivative, virtual access base ∥ } 其中,关键字ua既可以放在访问控制字之前,也可以放 在访问控制字之后 个类无论是否存在虚基类,其对象的使用方式完全一样
从上图可见,类中存在某一基类的多个副本不仅浪费了存储 空间,而且导致二义性。更为严重的是为了保持多个副本中 数据成员值的同步,将使操作变得极为复杂。 若欲保证派生类中仅有所有基类的一个副本,则应将其所有 基类说明为虚基类。说明虚基类的一般形式为: class derivative : virtual <access> base<, ...> { //… }; 其中,关键字 virtual 既可以放在访问控制字之前,也可以放 在访问控制字之后。 一个类无论是否存在虚基类,其对象的使用方式完全一样
例如,可以用以下的形式定义类 Student、 Worker和Work_stu class Student: virtual public Person private char * dEpartment;∥系部 char *sPeciality; ∥专业 class Worker: virtual public Person i private char' dEpartment;/工作部门 char pOb 工种 ∥/
例如,可以用以下的形式定义类 Student、Worker 和 Work_stu: class Student : virtual public Person { private: char *pDepartment; // 系部 char *pSpeciality; // 专业 // … }; class Worker : virtual public Person { private: char *pDepartment; // 工作部门 char *pJob; // 工种 // … };
class Work Stu: public Student, public Work 这样,类 Work stu的派生关系就如下图所示(注意:该类的对 象中,数据成员 dEpartment存在二义性) pName Person uAge uSex Student Worker dEpartment sPeciality Work Stu Department pOb
class Work_Stu : public Student, public Work { // … }; 这样,类 Work_Stu 的派生关系就如下图所示(注意:该类的对 象中,数据成员 pDepartment 存在二义性)。 Person Student Work_Stu Worker pName uAge uSex pDepartment pDepartment pSpeciality pJob
第11章类的其它特性 11.1友元函数 1111友元函数的说明和定义 友元函数也叫友元,是在类中说明的、用关键字 friend修饰 的普通函数。友元虽然不是类中的成员函数,但却拥有访间类 中任何成员的特权。说明友元的一般形式为 friend type func_ name(arg_ list); 注意:友元的函数原型必须在类中说明,且不受访问权限的制 约。说明它的类授予它有访问类中所有成员的权利
第11章 类的其它特性 11.1 友元函数 11.1.1 友元函数的说明和定义 友元函数也叫友元,是在类中说明的、用关键字 friend 修饰 的普通函数。友元虽然不是类中的成员函数,但却拥有访问类 中任何成员的特权。说明友元的一般形式为: friend type func_name(arg_list); 注意:友元的函数原型必须在类中说明,且不受访问权限的制 约。说明它的类授予它有访问类中所有成员的权利