*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,派生类与继承,1,派生类与继承1,继承(inheritance),继承是软件复用的一种形式,实现这种形式的方法是从现有的类建立新类。,新类继承了现有类的属性和行为,并且为了使新类具有自己所需的功能,新类还要对这些属性和行为予以修饰。,软件复用缩短了程序的开发时间,促使开发人员复用已经测试和调试好的高质量的软件,减少了系统投入使用后可能出现的问题。,2,继承(inheritance)继承是软件复用的一种形式,实现,为什么要使用继承?,继承性是一个非常自然的概念,现实世界中的许多事物是具有继承性的。人们一般用层次关系的方法来描述他们的关系。,汽车,运输汽车,专用汽车,消防车,洒水车,客车,货车,3,为什么要使用继承?继承性是一个非常自然的概念,现实世界中的许,在这个分类树中建立了一个层次结构,最高层是最普遍、最一般的,每一层都比它的前一层更具体,低层含有高层的特性,同时也与高层细微的不同,他们之间是基类和派生类的关系。,继承性也是程序设计中一个非常有用的、有力的特性,它可以让程序员在既有类的基础上,通过增加少量代码或修改少量代码的方法得到新的类,从而较好地解决了代码重用的问题。,另一个,例子,:,4,在这个分类树中建立了一个层次结构,最高层是最普遍、最一般的,,继承的必要性,class person,public:,void print();,private:,char name10;,int age;,char sex;,;,class employee,public:,void print();,private:,char name10;,int age;,char sex;,char department20;,float salary;,;,5,继承的必要性 class personclass empl,基类和派生类,在建立一个新类时,程序员可以让新类继承预定义,基类,(,base class,)的数据成员和成员函数,而不必重新编写新的数据成员和成员函数。这种新类称为,派生类,(,derived class,),6,基类和派生类在建立一个新类时,程序员可以让新类继承预定义基类,派生类的声明,例子,声明一个派生类的一般格式为:,class 派生类名:派生方式 基类名,/派生类新增的数据成员和成员函数,;,派生类名:声明的新类名,基类名:已经定义的类,派生方式:private或public,7,派生类的声明例子7,派生类的声明,定义一个基类(person),class person,public:,/,private:,char name10;,int age;,char sex;,;,定义一个派生类,Class employee,:,public,person,public:,/,private:,char depatrment20;,float salary;,派生方式,8,派生类的声明定义一个基类(person)定义一个派生类派生方,派生方式,派生方式与访问权限(,例子,),public:公有继承(公有派生),private:私有继承,缺省方式(私有派生),基类成员在基类和派生类中的访问权限:,派生方式,基类中的访问权限,派生类中的访问权限,public,public,public,protected,protected,private,不可访问,public,private,private,protected,private,private,不可访问,9,派生方式派生方式与访问权限(例子)派生方式基类中的访问权限派,派生类的声明,定义一个基类(person),class person,public:,/,private:,char name10;,int age;,char sex;,;,定义一个派生类,Class employee,:,public,person,public:,/,private:,char depatrment20;,float salary;,派生方式,10,派生类的声明定义一个基类(person)定义一个派生类派生方,派生方式,派生方式与访问权限(,例子,),public:公有继承(公有派生),private:私有继承,缺省方式(私有派生),基类成员在基类和派生类中的访问权限:,派生方式,基类中的访问权限,派生类中的访问权限,public,public,public,protected,protected,private,不可访问,public,private,private,protected,private,private,不可访问,11,派生方式派生方式与访问权限(例子)派生方式基类中的访问权限派,派生类实例,#include,class base,int x;,public:base(int i)x=i;,void showx()coutxendl;,;,class derived:private base,int y;,public:derived(int m)y=m;,void showxy(),coutxyendl;,;,X为基类base的私有数据,在派生类中不可访问,12,派生类实例#include X为基类,两种派生方式的特点,无论哪种派生方式,基类中私有成员既不允许外部函数访问,也不允许派生类中的成员函数访问,但是可以通过基类提供的共有成员函数访问。,基类中的公有成员在派生类中的访问属性,公有派生时,基类中的所有公有成员在派生类中也都是共有的。,私有派生时,基类中的所有公有成员只能成为派生类中的私有成员。,13,两种派生方式的特点无论哪种派生方式,基类中私有成员既不允许外,保护类成员,保护成员(protected)可以被派生类的成员函数访问,但是对于外界是隐藏起来的,外部函数不能访问它。,因此,为了便于派生类的访问,可以将基类私有成员中需要提供给派生类访问的成员定义为保护成员。,公有派生:基类中的保护成员在派生类中也为保护成员。,私有派生:基类中的保护成员在派生类中成为私有成员。,14,保护类成员保护成员(protected)可以被派生类的成员函,派生类构造函数和析构函数,创建派生类对象时,首先执行基类构造函数,其次执行派生类构造函数。,撤消派生类对象时,首先执行派生类析构函数,其次执行基类析构函数。(,例,),当基类无构造函数或有带缺省参数的构造函数时,派生类中可无构造函数;否则,派生类中必须定义构造函数,为基类构造函数传递参数,以构造基类。(,例,),15,派生类构造函数和析构函数 创建派生类对象时,首先执行基类构造,派生类实例,#include,class base,public:,base()cout构造基类endl;,base()cout析构基类endl;,;,class derived:base,public:,derived()cout构造继承类endl;,derived()cout析构继承类endl;,;,main(),derived obj;return 0;,构造基类,构造继承类,析构继承类,析构基类,16,派生类实例构造基类16,派生类实例,/,#include,class A,private:int x,y;,public:A(int myx,int myy)x=myx;y=myy;,void show()coutx=x y=yendl;,A()coutDeconstructing class A.endl;,;,class B:public A,private:int h,w;,public:,B(int myx,int myy,int myh,int myw):A(myx,myy),h=myh;w=myw;,void show()couth=h w=wendl;,B()coutDeconstructing class B.endl;,;,void main(),B d(3,4,5,6);d.show();d.A:show();,h=5 w=6,x=3 y=4,Deconstructing class B.,Deconstructing class A.,.,17,派生类实例/h=5 w=617,在C+中,派生类构造函数的一般格式为:,派生类构造函数名(参数表):基类构造函数名(参数表),/.,18,在C+中,派生类构造函数的一般格式为:18,