1 / 17
文档名称:

第08单元 类与对象(II).doc

格式:doc   页数:17
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

第08单元 类与对象(II).doc

上传人:中国课件站 2011/10/11 文件大小:0 KB

下载得到文件列表

第08单元 类与对象(II).doc

文档介绍

文档介绍:第8单元类与对象(II)
本单元教学目标
介绍类的继承与派生、虚函数和运算符重载等面向对象程序设计的基本概念,以及文件处理的基本方法。
学习要求
深入理解面向对象程序设计方法的基本思想,包括封装、继承和多态及其在C++中的实现方法。
教学内容
C++中的类体现了面向对象技术所要求的抽象和封装机制,同时为继承提供了基础。面向对象技术中的抽象、封装、继承和多态性强有力地支持了对复杂的大型软件系统的构建、分析和维护,是现代软件工程的基础。在本单元中,我们介绍面向对象技术中的继承、重载和多态性等特性在C++中的实现。
继承
继承这一概念源于分类概念。首先请看如图8-1所示的分类树。
在图8-1中,最高层为一般化概念,其下面的每一层都比其上的各层更具体化。一旦在分类中定义了一个特征,则由该分类细分而成的下层类目均自动含有该特征。例如,一旦确定某物为红富士苹果,则可以确定它具有苹果的所有特性,当然是水果。这种层次结构也可用“IS-A”关系表达,即如某物为红富士苹果,则其是一个(is a)苹果,是一个水果。
在C++中,类的继承关系类似这种分类层次关系。如果一个类继承了另一个类的成员(包括数据成员和成员函数),则称前者基类(或父类),后者为其派生类(或子类),后者从前者派生。类的派生过程可以继续下去,即派生类又可作其他类的基类。
由某基类派生一个新类的形式为:
class <派生类名>:<访问权限> <基类名>
{
... ...
};
其中访问权限可以是关键字public或private之一。如果为public,称派生类从基类公有派生;如果为private,称派生类从基类私有派生。
公有派生时,基类成员的访问权限在派生类中保持不变,即原来基类中的私有成员在派生类中仍为私有成员;原来基类中的公有成员在派生类中仍为公有成员。这就意味着在派生类外可以访问其从基类继承下来的公有成员。然而,对基类而言,派生类也是其“外部”,因此在派生类中不能直接访问基类中的私有成员,也必须通过基类所提供的公共接口(成员函数)才可以访问基类中的私有成员。
私有派生时,基类中所有成员的访问权限在派生类中均为私有。即从派生类外部来看,其基类的所有成员均不可见。因此,为了对基类中的数据成员进行操作,在派生类中必须声明相应的公有成员函数。
在类声明中,声明为protected的成员称做保护成员。保护成员具有双重作用:对于其派生类而言,它是公有的;而对于其外部的程序而言,则是私有的。通常,如果一个类主要是作为基类以供派生新类而用,则其数据成员声明成保护的比较方便。但在这种情况下,如果由于某种原因而改变了保护成员的表示形式,则这些改变也要影响到派生类。因此,在实用中应仔细权衡程序的效率与程序的可维护性,以决定是否采用保护成员。
在C++中,还有所谓抽象类。抽象类只能作为基类派生新类,在程序中不能声明抽象类的对象。有多种因素可以使得一个类成为抽象类,例如使用保护的构造函数。保护的构造函数对除该类的派生类以外的所有外部程序来讲是私有的,所以,外部程序由于无法调用该构造函数而不能创建该类的对象。对该类的派生类来讲,该构造函数却是公有的,因而在创建其派生类的对象时就可以调用它为基类成员分配内存。
保护的析构函数同样阻止了在撤消对象时对它的调用,因此,如果一个类的析构函数被声明为保护的,则该类也是一个抽象类。
[例8-1] 从Person类公有派生一个职员类。
// Example 8-1:职员类
class Employee:public Person
{
char m_sDepartment[21];
char m_sPosition[21];
float m_fSalary;
public:
Employee(){}
Employee(const char *,int,char,const char *,const char *,float);
void SetDepartment(const char *);
void SetPosition(const char *);
void SetSalary(float);
char *GetDepartment() const;
char *GetPosition() const;
float GetSalary() const;
};
分析:类Employee继承了其基类Person所有的成员。因此,在对Employee类的对象进行操作时,其基类的成员函数如GetName()等的用法与其自己的成员函数用法完全相同。
当派生类和基类中都定义有初始化构造函数时,则可在创建派生类的对象时调