C及C++程序设计 第十七章 类的继承_第1页
C及C++程序设计 第十七章 类的继承_第2页
C及C++程序设计 第十七章 类的继承_第3页
C及C++程序设计 第十七章 类的继承_第4页
C及C++程序设计 第十七章 类的继承_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十七章类的继承17.1继承17.2继承机制中的初始化17.3多重继承17.4虚基类17.1继承17.1.1继承与派生类如果要为每一种数据结构都从头定义,无疑会浪费时间。面向对象技术提供了一种机制,使程序设计者能够重用其它类的定义,构成自己的特有的类。在这个新的类中继承了被重用类的特性,又含有自己的特性。这种机制称为继承。从已有的类(基类)派生出一个新类(派生类)的格式是:

class类名1,访问控制类名2

{

privare:

成员说明列表

protected:

成员说明列表

public:

成员列表说明

);其中类名1是派生类名,类名2是基类名。“访问控制”用于规定基类成员在派生类中的访问权限,即基类成员在派生类中是公有的还是私有的。

访问控制使用public时,说明基类是派生类的公有成员,称类名1从类名2公有派生,类名2是类名1的公有基类。访问控制使用private时,说明基类是派生类私有成员,称类名1从类名2私有派生,类名2是类名1的私有基类。如果访问控制说明被省略,则隐含为private。

无论是公有派生还是私有派生,基类的私有成员在派生类中仍是私有。访问控制只是影响基类的公有成员和保护成员。17.1.2公有派生在公有派生的情况下,基类的所有public成员被继承为派生类的public成员,在派生类之外可以访问它们。基类中被说明为private的成员,派生类的成员函数不能访问它们。基类中的protected成员,在派生类中也是protected成员。这些成员可以供派生类的成员访问,但对其它类和函数则是私有的。例17.1.1从类point(点)公有派生类cercle(圆)首先,定义一个类point,它有两个私有数据成员:点的横坐标x和纵坐标y。四个公有的成员函数,用于操作数据成员x和y。类point的定义如下:

classpoint

{private:

intx;

inty;

public:

voidset_x(intnum);

intget_x(void);

voidset_y(intnum);

intget_y(void);

};我们用这个类派生出一个类cercle。其数据成员为圆的半径。因为,圆除了半径还需要一个点作为自己的圆心,而类“point”中已经有了这方面内容,所以,可以把类“point”作为基类,加以继承。于是定义类cercle(圆)如下:

classcircle:publicpoint{private:

intradius;

public:

intget_radius(void);

voidset_radius(intnum);

voidshow(void);

};这个例子选用public派生,所以,基类的所有public元素,就好象在point类中说明过一样。然而,派生类中的成员函数不能访问基类的私有部分。如果把类point中的private改为protected,则派生类就能访问它们了。这就是说,protected成员可以被继承。17.1.3私有派生当访问控制选用private时,即私有派生时,基类的所有public成员和protected成员被继承为派生类的private成员。即派生类的成员可以把它们作为自己私有成员来访问。派生类之外不能访问它们。在基类被说明为private的成员,派生类的成员也不能访问它们。即派生类不能继承基类的private成员。基类访问控制派生类对基类的可访问性publicpublicpublicprivatepublic不可访问protectedpublicprotectedpublicprivateprivatedprivateprivate不可访问protextedprivateprivate现将访问控制的作用归纳如表17.1.1。表17.1.117.2继承机制中的初始化由于派生类继承了基类中的数据,这就产生一个问题,如何和何时对基类的数据初始化,派生类如何初始化。上述问题可以通过基类和派生类的构造函数来解决。17.2.1不带参数的基类构造函数17.2.2带参数的基类构造函数当基类的构造函数含有参数时,任何派生类就必须包括构造函数。其原因是,这样就提供了一种把派生类构造函数的参数传递给基类构造函数的途径。为把参数传递给基类,就要在派生类构造函数后面,对这些参数加以说明。其一般形式为:

派生类名::派生类构造函数名(参数表):基类构造函数名(参数表)

{

//......

//......

}这里要注意用冒号“:”把派生类构造函数同基类的参数表分隔开。其作用是将派生类构造函数的参数,传递给基类相应的参数。这里两个构造函数的参数存在着对应关系。

17.3多重继承17.3.1多重继承的继承机制所谓多重继承就是一个类继承多个基类的属性。这时,一个派生类将有两个或两个以上的基类。例如,类C以private方式继承类A,同时又以public方式继承类B,如图17.1所示。

图17.1简单多重继承示意图

相应的定义语句可以这样写:

classC:privateA,publicB

{

//......

........

};

定义多重继承的派生类的一般形式为:

class派生类名:基类名列表

{

//......

........

}17.3.2指向派生类的指针指向基类的指针和指向派生类的指针之间有一定的关系。例如,有一基类名为B_class和它的派生类D_class,则C++定义,定义为B_class的指针,也能作为指向D_class的指针使用,并可以用这个指向派生类对象的指针访问继承来的基类成员;但不能用它访问派生类成员。定义为派生类的指针则既可以访问派生类中定义的成员,也可以访问从基类继承来的成员。17.4虚基类17.4.1多重继承中的二义性在C++中,如果在多条继承路径上有一个公共的基类,那么在这些路径中的某几条路径的汇合处,这个公共的基类会产生多个拷贝(实例)。

17.4.2虚基类为了使上例中的公共的基类只产生一个数据成员b的拷贝,可以将这个基类说明为虚基类。这样就不会产生二义性的问题。虚基类是在从基类派生出新类时,用关键字virtual将基类说明为虚基类的。例如:

classbase_der1:virtualpublicbase{public:

intbd1;

};classbase_der2:virtualpublicbase{public:

intbd2;

};这样说明以后,base类就只有一个数据成员b的拷贝。当der12类的对象或成员函数在使用base类中的成员时,就不会产生二义性的问题。一个派生类的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论