8.3 多重继承与派生类成员标识
来源:互联网 发布:自然语言处理算法 编辑:程序博客网 时间:2024/06/04 19:56
C++多重继承的概念
由多个基类共同派生出派生类的继承结构称为多重继承或多继承(multiple-inheritance)。多重继承是从实际的需要产生的。例如:从大学在册人员产生学生和教职工。再从学生派生研究生。如果考虑到研究生可以当助教,那么他们又有了教职工的特性。教职工可分为教师和行政人员,但行政人员也可以去授课,兼有教师的特点等。这就是多继承,其继承关系如下图所示。
图 大学在册人员继承关系
多重继承下的歧义性问题及解决
问题1:教职工兼研究生,在其基类“教职工”中有一个“身份证号”,另一基类“研究生”中也有一个“身份证号”,如果只讲他的身份证号那么是哪一个基类中的呢?这两者可能是一回事,但计算机系统并不这么认为。问题2:两个基类中可能也各有一个“职务”,这两者可能根本不同,一个是教职工的,一个是研究生的。但它们的标识符是一样的,这就会出现二义性。
解决办法:
- 类似于“职务”这样的成员可以用不同标识符来区分。
- 但“身份证号”不行,因为这是由两个基类“教职工”和“研究生”共同的基类“在职人员”类继承来的,只有同一个标志符。即唯一标识问题,通常采用作用域分辨符“::”:
基类名::成员名; //数据成员
基类名::成员名(参数表); //函数成员
举例:下图为在职研究生派生类关系
根据图中显示的派生关系,定义EGStudent类对象EGStudent1,并假定派生全部为公有派生,而int No全为公有成员,其含义如下所述:
EGStud1.No //在职学号
EGStud1.GStudent::No //研究生号
EGStud1.GStudent.Student::No //学生号,此处只为了说明成员唯一标识
EGStud1.GStudent.Student.Person::No //身份证号
EGStud1.Employee::No //工作证号
EGStud1.Employee.Person::No //身份证号
派生类成员标识的进一步说明
EGStud1.GStudent.Student.Person::No和EGStud1.Employee.Person::No这两个身份证号从逻辑上讲应是一回事,但是物理上分配了不同内存空间,是两个变量,请参见下图(图中蓝色框为相应类的对象)。若class Person的身份证号标识为 int IdPerson,则可写为:
EGStud1.GStudent::IdPerson
EGStud1.Employee::IdPerson
采用有确定字面意思的标识符,可以被编译器简单区分出来,且不必标出那么多层次的类,但写EGStud1.IdPerson是错的。
作用域分辨符不能嵌套使用,如下面的描述均是错误的:
EGStud1.GStudent::Student::No //学生号
EGStud1.GStudent::Student::Person::No //身份证号
应用举例
【例8.2】由圆和高多重继承派生出圆锥。因为公有派生时,在派生类中不可以直接访问基类的私有成员,但可以直接访问基类的保护成员,所以当需要在派生类中访问基类的数据成员时,可以将它们定义为保护的,而不是私有的。 (查看源码) 0 0
- 8.3 多重继承与派生类成员标识
- C++多重继承与派生类成员标识
- C++多重继承与派生类成员标识
- C++多重继承与派生类成员标识
- 派生类成员的标识与访问
- 多重继承、派生类
- C++派生类的成员标识与访问
- C++派生类的成员标识与访问
- 多重继承派生Teacher_Cader类
- 继承与派生:派生类对基类成员的访问控制之公有继承
- 三十七、继承与派生:派生类对基类成员的访问控制之公有继承
- 二十七、继承(四) 多重继承、虚继承与虚基类、虚基类及其派生类构造函数
- 多重继承派生类的构造函数
- 多重继承派生类的构造函数
- 多重继承派生类的构造函数
- 继承与派生:派生类对基类成员的访问控制之保护继承与私有继承
- 三十八、继承与派生:派生类对基类成员的访问控制之保护继承与私有继承
- 继承与派生4:派生类中对基类成员的重定义
- 7.6 栈与队列-栈的基本操作和应用
- 7.7 栈与队列-队列及其操作
- 7.8 二叉树
- 8.1 继承与派生的概念
- 8.2 派生类的构造函数与析构函数
- 8.3 多重继承与派生类成员标识
- 8.4 虚基类
- 8.5 派生类应用讨论
- Palindrome Number
- 8.6 多态性与虚函数
- 9.1 C++的基本流类体系
- 9.2 输入输出的格式控制
- Android 源码系列之<八>从源码的角度深入理解缓存策略之LruCache
- 9.3 标准设备的输入/输出