文档介绍:第13章继承和派生
通过继承已有类的部分或全部成员,创建新类的过程称为派生。
继承既简化程序设计,显著提高软件的重用性,又使软件维护更容易。
继承
初始化基类成员
冲突、支配规则和赋值兼容性
虚基类
虚函数
作业:6,8,10,11
继承
在定义类A时,若使用了已有类B,则称类A继承了类B,并称类B为基类或父类,称类A为派生类或子类。
一个派生类又可作为另一个类的基类,一个基类可派生出若干个派生类,这样就构成类树或类族。
继承分为
单一继承:一个派生类仅有一个基类;
多重继承:一个派生类有两个或两个以上的基类。
举例:见图13-1,图中的箭头是从派生类指向基类。
在校人员类:描述在校人员的共性信息(如姓名、年龄、身高和性别等)。
学生类:单一继承“在校人员类”,并增加描述学生的个性信息(如学号、所学专业和课程等)。
职工类:单一继承“在校人员类”,并增加描述职工的个性信息(如工资、工作部门、职工号、所教课程等)。
在职研究生类:多重继承“学生类”和“职工类”。
类族:在校人员类、学生类、职工类、在职研究生类。
单一继承
格式:
class ClassName:<Access> BaseClassName
{
…//派生类中新增成员,可为空
};
规定基类成员在派生类中的访问权限,取public、private和protected三者之一或缺省。
ess为public时,为公有派生;ess为private时,为私有派生;ess为protected时,为保护派生。
Access缺省时,类为private;结构体为public。
派
生
类
的
类
名
已定义的类名
公有派生
基类成员在公有派生类中保持原有访问权限。
基类的public成员,在派生类中仍为public成员。
基类的private成员,在派生类中仍为private成员。注意,派生类不能直接使用基类中的私有成员。
基类的protected成员,在派生类中仍为protected成员,在派生类中可直接访问,但在派生类外,不可直接访问。
公有派生。
#include<>
class A
{ int x;
protected:
int y;
public:
int z;
A(int a,int b,int c){ x=a;y=b;z=c; }
void Setx(int a){ x=a; }
void Sety(int a){ y=a; }
int Getx( ){ return x; }
int Gety( ){ return y; }
void ShowB( )
{cout<<"x="<<x<<"\ty="<<y<<"\tz="<<z<<'\n';}
};
class B:public A //公有继承基类A,派生类B
{ int Length,Width;
public:
B(int a,int b,int c,int d,int e): A(a,b,c)
{ Length=d;Width=e; }
在派生类的构造函数中,初始化基类的成员数据:用成员初始化列表调用基类的构造函数,。
void Show( )
{ cout<<"Length="<<Length<<"\tWidth="<<Width<<'\n';
cout<<"x="<<Getx( )<<"\ty="<<y<<"\tz="<<z<<'\n';
}
int Sum( ){ return Getx( )+y+z+Length+Width; }
};
 
void main(void)
{ B b1(1,2,3,4,5);
( );
( );
cout<<"Sum="<<( );
cout<<"\ny="<<( );
cout<<"\tz="<<<<'\n';
}
在派生类B内:直接使用基类中的保护成员y和公有成员z;但不能直接使用基类的私有成员x,例如,若将Getx( )改为x,则会出现编译错误。
在派生类B外:派生类B的对象b1直接使用基类的公有成员函数ShowB( )、Gety( )和基类的公有成员数据z。
问:?
私有派生
基类中公有成员和保护成员在私有派生类中均变为私有的,在派生类中仍可直接访问,但在派生类之外均不可直接访问。
基类中的私有成员在私有派生类中不可直接访问,当然在派生类之外,更不直接访问。
私有派生。
#lnclude<>
 
class A
{ int x;
protected