当前位置:文档之家› 第5章 继承和派生类

第5章 继承和派生类

面象对象程序设计
2010/9/18
第5章 继承和派生类
程序运行结果: x=4 y=5 l=6 w=8 程序分析: 通过公有继承方式,从BaseClas类得到DerivedClass类。 派生类DerivedClass只有一个基类,所以是单继承。基类 BaseClass定义了两个数据成员,3个成员函数。派生类 DerivedClass定义了两个数据成员,3个成员函数。通过 继承,派生类DerivedClass拥有4个数据成员:x、y、l和 w,6个成员函数:setx ( )、sety ( )、setl ()、setw ( )、 displayxy ( )、displaylw( )。
2010/9/18
面象对象程序设计
第5章 继承和派生类
class Father:private Grandfather //中间类:Grandfather的 公有派生类, //Son的基类 { public: void test() { b1=10; //可以访问,因b1改为private b2=20; //可以访问,因b2改为private b3=30; //不可访问, 因b3改为不可访问 } };
2010/9/18
面象对象程序设计
第5章 继承和派生类
5.1.2 继承的种类
在C++语言中,一个派生类既可以从一个基类派生,也可 以从多个基类派生。从一个基类派生的继承被称为单继承。 单继承形成的类层次是一个倒挂的树,如图5.2所示。从 多个基类派生类的继承被称为多继承。多继承形成的类层 次是一个有向无环图(DAG),如图5.3所示。在图5.2中, 输入设备是基类,从它派生出了3个派生类:键盘类、鼠 标类和扫描仪类。在图5.3中,从教师类和干部类派生出 校长类,即校长类有两个基类。
2010/9/18
//不可访问 //不可访问 //不可访问 //不可访问 //不可访问 //不可访问
面象对象程序设计
第5章 继承和派生类
程序分析: 程序分析 (1) 在主函数main( )中,定义了3个对象:Grandfather d1、 Father d2、Son d3。在基类Grandfather中定义了3个成 员:公有成员b1、保护成员b2、私有成员b3。 (2) b1是Grandfather类中的公有成员,通过公有继承成为派 生类Father中的公有成员,Father的成员函数test( )可以 访问它,再从Father类公有派生,b1成为Son类的公有成 员,当然Son的成员函数test( )能访问它,所以3个对象都 能够对b1访问。可见,基类的公有成员通过公有继承派生 到派生类,可以被派生类的成员函数访问,也能被派生类 对象访问。
面象对象程序设计
2010/9/18
第5章 继承和派生类
教 师
大教 学师
中教 学师
小教 学师
本生师 科教
研生师 究导
初教 中师
高教 中师
硕生师 士导
博生师 士导
图5.1 教师分类层次图
2010/9/18
面象对象程序设计
第5章 继承和派生类
(1) 增加新的成员变量。 (2) 增加新的成员函数。 (3) 重新定义已有的成员函数。 (4) 改变现有成员的属性。 继承还是面向对象程序设计中软件重用的关键技术。新的类 是原有类的数据、操作和自己所增加的数据、操作的组合。 新的类把原有类作为基类引用,而不需要修改原有类的定 义。新定义的类作为派生类引用。这种可重用、可扩充技 术大大降低了大型软件的开发难度。
第5章 继承和派生类
5.1 基类和派生类 5.2 单继承 5.3 多继承 5.4 继承机制下构造函数与析构函数的调用顺序 5.5 上机指导
主目录
第5章 继承和派生类
5.1 基类和派生类
5.1.1 继承和派生的基本概念
通过继承机制,可以利用已有的数据类型来定义新的数据类型。 根据一个类创建一个新类的过程称为继承(inheritance),也称 派生。新类自动具有原有类的成员,根据需要还可以增加新成 员。派生新类的类称为基类,又称父类,而将派生出来的新类 称为派生类,又称子类。 换句话说,继承就是创建一个具有别的类的属性和行为的新类 的能力。派生类同样能作为其他类的基类,这就产生了类的层 次性。在日常生活中,许多事物之间存在着类层次关系。
2010/9/18
面象对象程序设计
第5章 继承和派生类
【例5.2】 分析下列程序,理解公有派生基类成员的访问权 限。 class Grandfather //基类 { public: int b1; protected: int b2; private: int b3; };
2010/9/18
面象对象程序设计
面象对象程序设计
第5章 继承和派生类
【例5.1】 阅读程序,了解继承和派生类的基本概念,熟悉 单继承的定义格式。 #include<iostream.h> class BaseClass{//定义基类 private: int x,y; public: void setx(int myx){x=myx;} void sety(int myy){y=myy;} void displayxy(){cout<<"x="<<x<<" "<<"y="<<y<<endl;} };
2010/9/18
面象对象程序设计
第5章 继承和派生类
输入设备
键盘
鼠标
扫描仪
图5.2 单继承
教师 干部
校长
图5.3 多继承
2010/9/18
面象对象程序设计
第5章 继承和派生类
5.2 单继 承 5.2.1 单继承的定义格
在C++中,单一继承的一般形式为: 式 class<派生类名>:<继承方式><基类名> { private: <成员说明列表> public: <成员说明列表> };
2010/9/18
面象对象程序设计
第5章 继承和派生类
图5.1展示了教师的类层次。在分类层次图中,下 层都具有上层的特征,如中学教师是由教师类派 生出来的,具有教师类的特征。它还具有自己的 特征,它本身最大的特征是教的学生是中学生。 类的派生,或者说继承,常用来表示类属关系, 即is-A关系。如:中学教师是教师。不能将继承 理解为构成关系。当从现存类中派生出新类时, 可以对派生类做如下几种变化。
2010/9/18
//不可访问 //不可访问 //不可访问 //不可访问 //不可访问 //不可访问 //不可访问 //不可访问
面象对象程序设计
第5章 继承和派生类
程序分析: 程序分析 (1) b1是Grandfather类中的公有成员,通过私有继承成为派 生类Father中的私有成员,Father的成员函数test( )可以 访问它。再从Father类公有派生,b1成为Son类的不可访 问成员,当然Son的成员函数test( )不能访问它,所以只 有基类自己的对象d1能够对b1访 问。可见,基类的公有 成员通过私有继承派生到派生类,可以被派生类的成员函 数访问,但不能被派生类对象访问。 (2) b2是Grandfather类中的保护成员,通过私有继承成为派 生类Father中的私有成员,Father的成员函数test( )可以 访问它。再从Father类公有派生,b2成为Son类的不可访 问成员,当然Son的成员函数test( )不能访问它,所以对 象d2和d3对b2的访问均是错误的。
2010/9/18
面象对象程序设计
第5章 继承和派生类
void main() { Grandfather d1; d1.b1=1; d1.b2=1; d1.b3=1; Father d2; d2.b1=2; d2.b2=2; d2.b3=3; Son d3; d3.b1=2; d3.b2=2; d3.b3=3; }
2010/9/18
面象对象程序设计
第5章 继承和派生类
可见,基类的私有成员通过公有继承派生到派生类,既不 能被派生类的成员函数访问,也不能被派生类对象访问。 2. 私有派生基类成员的访问权限 当类的继承方式为私有继承时,在派生类中,基类的公有 成员和保护成员作为派生类的私有成员,派生类的成员函 数可以直接访问它们,而派生类的成员函数无法直接访问 基类的私有成员。在类外部,派生类的对象无法访问基类 的所有成员。
2010/9/18
面象对象程序设计
第5章 继承和派生类
void main() { Grandfather d1; d1.b1=1; d1.b2=1; d1.b3=1; Father d2; d2.b1=2; d2.b2=2; d2.b3=3; Son d3; d3.b1=2; d3.b2=2; d3.b3=3; }
2010/9/18
面象对象程序设计
第5章 继承和派生类
5.2.2 基类成员在派生类中的访问权 限 1. 公有派生基类成员的访问权限
当类的继承方式为公有继承时,在派生类中,基类的公有 成员和保护成员被继承后分别作为派生类的公有成员和保 护成员,这样使得派生类的成员函数可以直接访问它们, 而派生类成员函数无法直接访问基类的私有成员。在类外 部,派生类的对象可以访问继承下来的基类公有成员。
2010/9/18
面象对象程序设计
第5章 继承和派生类
class DerivedClass:public BaseClass{//定义派生类,公有继承方式 private: int l,w; public: void setl(int myl){l=myl;}; void setw(int myw){w=myw;}; void displaylw(){cout<<"l="<<l<<" "<<"w="<<w<<endl;}}; void main() { DerivedClass r;// 派生类对象 r.setx(4); r.sety(5); r.setl(6); r.setw(8); r.displayxy(); r.displaylw(); }
相关主题