多继水和虚基类
多继承和虚基类
主要内容 多继承的定义 ■多继承中构造函数的定义及其调用 虚基类的概念 虚基类的定义
◼ 多继承的定义 ◼ 多继承中构造函数的定义及其调用 ◼ 虚基类的概念 ◼ 虚基类的定义 主要内容
人 多继系 黄种人 单继承 中国人韩国人越南人日本人 派生类只有一个基类! 人 多继承继承 学生 教师 派生类“助教”有多个基类! 助教
多继承 人 黄种人 中国人 韩国人 越南人 日本人 •单继承 派生类只有一个基类! •多继承继承 人 学生 教师 助教 派生类“助教”有多个基类!
多继承的定义 ●定义格式 class,…, <派生类新定义成员 例:根据图示完成类A、B、C的定义 A B C abc a b C
多继承的定义 class : ,…, { }; •定义格式 例: 根据图示完成类A、B、C的定义 a b c A B C c b a C
多继承的构造巫数 ()(),…,() 多继承方式下构造函数的调用顺序: 1)按照基类在派生类定义中出现的顺序调用所有基类 的构造函数 2)若存在对象,调用对象的构造函数 3)调用派生类自身的构造函数;
多继承的构造函数 ():(),…, () { }; 多继承方式下构造函数的调用顺序: 1) 按照基类在派生类定义中出现的顺序调用所有基类 的构造函数; 2) 若存在对象,调用对象的构造函数; 3) 调用派生类自身的构造函数;
A 例1:写出C的构造函数,并说 a Bb 明构造函数的调用顺序 C class C: public B, public A C int c C(inti,intj,intk):A(),B(j)∥还可以写为 调用顺序:B--A--C∥/与初始化成员列表无关!! 例2:示例多继承方式下构造函数和析构函数的调用顺序
例1: 写出C的构造函数,并说 明构造函数的调用顺序。 a b c A B C 例2: 示例多继承方式下构造函数和析构函数的调用顺序。 C(int i, int j, int k):A(i),B(j) //还可以写为…… { } c = k; class C: public B, public A { }; int c; 调用顺序:B----A-----C //与初始化成员列表无关!!
虚基类 name 人 insert name id 继承的二义性 insert id salar name prnt学生 教师 insert_salary insert_name print name dn 研究生 insert name insert dn d insert id 助教 print print 思考助教类中有哪些类成员? 出现这种问题的原因是什么? insert name
虚基类 人 学生 教师 助教 研究生 name insert_name id insert_id print dn insert_dn salary insert_salary print print 思考助教类中有哪些类成员? name insert_name name insert_name id insert_id print …… insert_name 继承的二义性 出现这种问题的原因是什么?
虚基类「人 应基类 学生 教师 ■解决继承二义性问题: 研究生 部分或全部直接基类具有相同的父类 助教 ■定义格式 dasstua ■例3示例虚基类的应用
虚基类 ◼解决继承二义性问题: 部分或全部直接基类具有相同的父类 人 学生 教师 助教 研究生 虚基类 ◼定义格式 class :virtual ◼例3 示例虚基类的应用
引入虛基类后构造函数的调用顺序: ●同一层次中,先调用虚基类的构造函数; ●同一层次中,若存在多个虚基类,则按照派生类中的 定义顺序调用其构造函数; 不同层次中,还是先调用基类构造函数再调用派生类 构造函数; 例4示例虚基类引入后构造函数调用顺序 Base2 Base2 Base1虚 even Leve2虚 TopLevel
引入虚基类后构造函数的调用顺序: •同一层次中,先调用虚基类的构造函数; •不同层次中,还是先调用基类构造函数再调用派生类 构造函数; •同一层次中,若存在多个虚基类,则按照派生类中的 定义顺序调用其构造函数; 例4 示例虚基类引入后构造函数调用顺序 Base2 Base2 Base1 Level1 Level2 TopLevel 虚 虚