第八章继承性 ●●●●● ●●●● 继承( inheritance)机制是面向对象程序设计使代码可以° 复用的最重要的手段,它允许程序员在保持原有类特性的基础 上进行扩展,增加功能。这样产生新的类,称派生类。派生类 不是简单地继承基础类的特性,它可以调整部分成员的特性, 也可以增加一些新成员。继承呈现了面向对象程序设计的层次 结构。体现了由简单到复杂的认识过程。 81继承与派生的概念 8.5类层次中成员名的作用域 82派生类的构造函数与析构函数86类层次中类转换规则 83多重继承与派生类成员标识 87多重继承的应用例子 84虚基类 88MFC基础类及其层次结构
继承(inheritance)机制是面向对象程序设计使代码可以 复用的最重要的手段,它允许程序员在保持原有类特性的基础 上进行扩展,增加功能。这样产生新的类,称派生类。派生类 不是简单地继承基础类的特性,它可以调整部分成员的特性, 也可以增加一些新成员。继承呈现了面向对象程序设计的层次 结构。体现了由简单到复杂的认识过程。 第八章 继承性 8.1 继承与派生的概念 8.4 虚基类 8.3 多重继承与派生类成员标识 8.8 MFC基础类及其层次结构 8.5 类层次中成员名的作用域 8.2 派生类的构造函数与析构函数 8.7 多重继承的应用例子 8.6 类层次中类转换规则
8.1继承与派生的念 ●●●●● 层次概念是计算机的重要概念。通过继承( inheritance】 的机制可对类(cass)分层,提供类型/子类型的关系。c++ 通过类派生( class derivation)的机制来支持继承。继承是类 之间定义的一种重要关系。定义类B时,自动得到类A的操作和 数据属性,使得程序员只需定义类A中所没有的新成分就可完成 在类B的定义,这样称类B继承了类A,类A派生了类B,A是基类 (父类),B是派生类(子类)。这种机制称为继承。 称已存在的用来派生新类的类为基类( base class),又 称为父类。由已存在的类派生出的新类称为派生类( derived class),又称为子类。派生类可以具有基类的特性,共享基类 的成员函数,使用基类的数据成员,还可以定义自己的新特性, 定义自己的数据成员和成员函数。基类和派生类的集合称作类继 承层次结构( hierarchy) 在C++语言中,一个派生类可以从一个基类派生,也可以 从多个基类派生。从一个基类派生的继承称为单继承;从多个基 类派生的继承称为多继承。下图反映了类之间继承和派生关系
8.1 继承与派生的概念 层次概念是计算机的重要概念。通过继承(inheritance) 的机制可对类(class)分层,提供类型/子类型的关系。C++ 通过类派生(class derivation)的机制来支持继承。继承是类 之间定义的一种重要关系。定义类B时,自动得到类A的操作和 数据属性,使得程序员只需定义类A中所没有的新成分就可完成 在类B的定义,这样称类B继承了类A,类A派生了类B,A是基类 (父类),B是派生类(子类)。这种机制称为继承。 称已存在的用来派生新类的类为基类(base class) ,又 称为父类。由已存在的类派生出的新类称为派生类(derived class) ,又称为子类。派生类可以具有基类的特性,共享基类 的成员函数,使用基类的数据成员,还可以定义自己的新特性, 定义自己的数据成员和成员函数。基类和派生类的集合称作类继 承层次结构(hierarchy) 在C++语言中,一个派生类可以从一个基类派生,也可以 从多个基类派生。从一个基类派生的继承称为单继承;从多个基 类派生的继承称为多继承。下图反映了类之间继承和派生关系
8.1继承与派生的欐念國囻圓:: ●●●● ●●0 交通工具 文艺节目 汽车车轮船飞机歐歌曲舞蹈相声小晶 轿车货车旅游车 合唱独唱匚重唱 通俗美声 A X B C 多继承 单继承
8.1 继承与派生的概念 交通工具 文艺节目 汽车 火车 轮船 飞机 歌曲 舞蹈 相声 小品 轿车 货车 旅游车 合唱 独唱 二重唱 通俗 美声 A B C X Y Z 单继承 多继承
8.1类的派生局缝歌 ●●●●● ●●●● 由基类派生出派生类的定义的一般形式为 ●●0 ●●● class派生类名:继承方式1基类名1《,继承方式2 基类名2,…,继承方式n基类名n》{ private: 成员表1;∥/派生类新增加或替代的私有成员 public. 成员表2;/派生类新增加或替代的公有成员 protected 成员表3;∥/派生类新增加或替代的保护成员 };//分号不可少 其中基类1,基类2,是已声明的类。在派生类定义的 类体中给出的成员称为派生类成员,它们是新增加的数据和函 数成员。这些新增加的成员是派生类对基类的发展,它们给派 生类添加了不同于基类的新的属性和功能。派生类成员包括新 添加的,也包括通过屏蔽作用,取代基类成员的更新成员
由基类派生出派生类的定义的一般形式为 class 派生类名:继承方式1 基类名1《,继承方式2 基类名2,……,继承方式n 基类名n》{ private: 成员表 1; //派生类新增加或替代的私有成员 public: 成员表 2; //派生类新增加或替代的公有成员 protected: 成员表 3; //派生类新增加或替代的保护成员 };//分号不可少 其中基类1,基类2,……是已声明的类。 在派生类定义的 类体中给出的成员称为派生类成员,它们是新增加的数据和函 数成员。这些新增加的成员是派生类对基类的发展,它们给派 生类添加了不同于基类的新的属性和功能。派生类成员包括新 添加的,也包括通过屏蔽作用,取代基类成员的更新成员。 8.1.1 类的派生与继承
8.1类的派生与继最 ●●●●● ●●●● ●●0 ●●● 如果一个派生类可以同时有多个基类,称为多重继承 multiple-inheritance),这时的派生类同时得到了多个 已有类的特征。一个派生类只有一个直接基类的情况称为单 继承( single-inheritance) 个基类 派生出来 基类1基类2 基类n 基类可以直接 的新类同 派生出多 样可以作 个派生类 为基类再 继续派生 出更新的 派生类1 派生类2派生类1 派生类2 类,依此 类推形成 个层次 (a)多重继承 结构。 (b)单继承 图81多重继承与单继承心
基类1 基类2 …… 基类n 派生类1 派生类2 基类 派生类1 派生类2 (a)多重继承 (b)单继承 图8.1 多重继承与单继承 一个基类 可以直接 派生出多 个派生类 派生出来 的新类同 样可以作 为基类再 继续派生 出更新的 类,依此 类推形成 一个层次 结构。 8.1.1 类的派生与继承 如果一个派生类可以同时有多个基类,称为多重继承 (multiple-inheritance),这时的派生类同时得到了多个 已有类的特征。一个派生类只有一个直接基类的情况称为单 一继承(single-inheritance)
8.1类的派生与继泵 吸收基类的成员不论是数据成员,还是函数成定 ●●● 除构造函数与析构函数外全盘接收。 编制 声明一个和某基类成员同名的新成员派 派生改造基类成员生类中的新成员就屏蔽了基类同名成员 类时 称为同名覆盖( override) 可分 四步发展新成派生类新成员必须与基类成员不同名,它 的加入保证派生类在功能上有所发展。 重写构造函数与析构函数 算法和编程的步骤必须规范化地编程 第二步:新成员如是成员函数,参数表也必须一样,否则是 重载。 第三步:独有的新成员才是继承与派生的核心特征。 第四步:是重写构造函数与析构函数,派生类不继承这两种 函数
编制 派生 类时 可分 四步 吸收基类的成员 改造基类成员 发展新成员 重写构造函数与析构函数 8.1.1 类的派生与继承 不论是数据成员,还是函数成员, 除构造函数与析构函数外全盘接收 声明一个和某基类成员同名的新成员派 生类中的新成员就屏蔽了基类同名成员 称为同名覆盖(override) 派生类新成员必须与基类成员不同名,它 的加入保证派生类在功能上有所发展。 算法和编程的步骤必须规范化地编程: 第二步:新成员如是成员函数,参数表也必须一样,否则是 重载。 第三步:独有的新成员才是继承与派生的核心特征。 第四步:是重写构造函数与析构函数,派生类不继承这两种 函数
8.2公有派生与私有派生 ●●●●● 继承方式,亦称为访问控制,是对基类成员的引用作进一步的限制。。 继承方式也有三种:公有( public)方式,保护( protected)方式和。。 私有( private)方式,亦称公有继承、保护继承和私有继承 ●●●● 在派生类的定义中,基类前所加的继承方式有两方面含义:派生类成员 (新增)函数对基类(继承来的)成员的访问权限,和从派生类对象之外对 派生类对象中的基类成员的访问权限。一般来说,公有派生是绝对主流。 1.公有继承( public)。 公有继承的特点是基类的公有成员和保护成员作为派生类的 成员时,它们都保持原有的状态,而基类的私有成员仍然是私有 的 2.私有继承( private)。 私有继承的特点是基类的公有成员和保护成员作为派生类的 私有成员,并且不能被这个派生类的子类访问 3.保护继承( protected) 保护继承的特点是基类的所有公有成员和保护成员都成为派 生类的保护成员,并且只能被它的派生类成员函数或友元访问 基类的私有成员仍然是私有的
8.1.2 公有派生与私有派生 继承方式,亦称为访问控制,是对基类成员的引用作进一步的限制。 继承方式也有三种:公有(public)方式,保护(protected)方式和 私有(private)方式,亦称公有继承、保护继承和私有继承。 在派生类的定义中,基类前所加的继承方式有两方面含义:派生类成员 (新增)函数对基类(继承来的)成员的访问权限,和从派生类对象之外对 派生类对象中的基类成员的访问权限。一般来说,公有派生是绝对主流。 1. 公有继承(public)。 公有继承的特点是基类的公有成员和保护成员作为派生类的 成员时,它们都保持原有的状态,而基类的私有成员仍然是私有 的。 2. 私有继承(private)。 私有继承的特点是基类的公有成员和保护成员作为派生类的 私有成员,并且不能被这个派生类的子类访问。 3. 保护继承(protected)。 保护继承的特点是基类的所有公有成员和保护成员都成为派 生类的保护成员,并且只能被它的派生类成员函数或友元访问, 基类的私有成员仍然是私有的
8.2公有派生蜀私有派生 派生方式基类中的在派生类中对在派生类对象外 访问限定基类成员的访访问派生类对象 可限定 的基类成员 公有派生 public public 可直接访问 protected protected 不可直接访问 private不可直接访问不可直接访间 私有派生 public private 不可直接访问 protected private 不可直接访问 private不可直接访间不可直接访问 (1)在公有继承时,派生类的对象可以访问基类中的公有成 员;派生类的成员函数可以访问基类中的公有成员和保护成员。 这里,一定要区分清楚派生类的对象和派生类中的成员函数对 基类的访问是不同的。 (2)在私有继承时,基类的成员只能由直接派生类访问,而 无法再往下继承
8.1.2 公有派生与私有派生 private 不可直接访问 不可直接访问 protected private 不可直接访问 私有派生 public private 不可直接访问 private 不可直接访问 不可直接访问 protected protected 不可直接访问 公有派生 public public 可直接访问 在派生类对象外 访问派生类对象 的基类成员 在派生类中对 基类成员的访 问限定 基类中的 访问限定 派生方式 (1)在公有继承时,派生类的对象可以访问基类中的公有成 员;派生类的成员函数可以访问基类中的公有成员和保护成员。 这里,一定要区分清楚派生类的对象和派生类中的成员函数对 基类的访问是不同的。 (2)在私有继承时,基类的成员只能由直接派生类访问,而 无法再往下继承
8.2公有派生蜀私有派生 ●●●●● 情况相同。两者的区别仅在于对派生类的成员而言,对基 类成员有不同的可访问性。 (4)如果派生类定义了与基类同名的成员,称派生类的成 员覆盖了基类的同名成员,若要在派生类中使用基类同名 成员,可以显式地使用类名限定符: 类名::成员 (5)派生类不能访问基类私有成员 基类 派生类 基类 派生类 基类 派生类 public public public -public Protected protectedprotected protectedproteced private private private private 不可见 不可见 不可见 private派生 protected派生 public派生
8.1.2 公有派生与私有派生 (3)对于保护继承方式,这种继承方式与私有继承方式的 情况相同。两者的区别仅在于对派生类的成员而言,对基 类成员有不同的可访问性。 (4)如果派生类定义了与基类同名的成员,称派生类的成 员覆盖了基类的同名成员,若要在派生类中使用基类同名 成员,可以显式地使用类名限定符: 类名 :: 成员 (5)派生类不能访问基类私有成员 基类 派生类 基类 派生类 基类 派生类 public public public public Protected protected protected protected proteced private private private private 不可见 不可见 不可见 private 派生 protected 派生 public 派生
8.2公有派生蜀私有派生 ●●●●● 派生继承的例子: ●●●● ●●0 class Base t ●●● ●●●● private int b39 protected int b2: public. int b1 Si class D1: public Base t publica void testo {b1=10;∥/可以,b1为 public b2=20}//可以,b2为 proteced b3=30}//不可以,b3为 private
8.1.2 公有派生与私有派生 派生继承的例子: class Base { private: int b3; protected: int b2; public: int b1; }; class D1:public Base { public: void test() { b1 = 10; // 可以,b1为public b2 = 20; // 可以,b2为proteced b3 = 30; // 不可以,b3为private } }