面向对象程序设计05-1.派生新类_第1页
面向对象程序设计05-1.派生新类_第2页
面向对象程序设计05-1.派生新类_第3页
面向对象程序设计05-1.派生新类_第4页
面向对象程序设计05-1.派生新类_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象程序设计派生新类 内容提要类层次的问题派生与继承派生类多继承与虚拟继承3提出问题【例】编写一个程序实现小型公司的工资管理。该公司主要有4类人员:经理、兼职技术员、销售员和销售经理。要求存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息。4月工资计算办法是:1.经理拿固定月工资8000元;2.兼职技术员按每小时100元领取月工资;3.销售员按该当月销售额的6%提成;4.销售经理既拿固定月工资也领取销售提成,固定月工资为5000元,销售提成为所管辖部门当月销售总额的5。5分析问题由于对这4类人员的月工资计算方法不同,显示信息的内容也不同,因此不能用同一个类来描述,我们设计4个类分别

2、描述这4类人员。但是,这4个类中又有很多相同的,如姓名、编号、工资,都要计算月工资和显示信息等,只是各自的实现方法有所不同。6按照常规思维方式,我们应该先统一描述该公司全体员工的共性以及对全体人员的处理功能;描述某一类人员时,首先说明他是该公司的员工,然后再逐一描述该类人员的个性。这种描述方法反映到面向对象的程序设计中就是类的继承与派生。对各类人员的统一描述就构成了一个基类,而对每一类人员的特殊描述就可以通过从基类创建派生类来实现。 7这个问题涉及多个相关的类,他们具有一些共同特征,因此,我们可以定义一个统一他们属性和操作的类,如Employee类,再从该类进行派生,类似于人类社会的繁衍。这就

3、是本章要介绍的派生与继承。 8派生与继承派生是指由基类创建新类的过程。新类称为派生类或子类,基类也可称作父类。继承是指新类(派生类)保留基类的成员的特性。继承意味着“自动地拥有”,即派生类中不必重新定义已在基类中定义过的属性和操作,而是自动地、隐含地拥有其基类的属性和行为。继承具有传递性。继承的作用是体现特殊与一般的关系,同时,实现了代码重用。9class A int i;/基类成员;class B:public A/A派生了B,B继承了A,B自/动拥有A的成员 int j;/定义派生类的新成员;10SalesManagerEmployeeSalesmanManagerTechnician11

4、派生类定义派生类是由基类通过派生而创建出来的新类,是基类的特殊类。派生类自动继承了基类的全部数据成员和除了构造、析构函数之外的全部成员函数,同时具有自己新定义的成员,并不等同于基类。12派生类的定义格式如下:class : ;类的继承方式有公有继承、保护继承和私有继承三种,分别用public、protected和private来表示,默认情况下为私有继承。13class Base private:int b_number;public:Base( )Base(int i) : b_number (i) int get_number( ) return b_number;void print(

5、) cout b_number endl; ;class Derived : public Base private:int d_number;public:Derived( int i, int j ) : Base(i), d_number(j) ; void print( ) cout get_number( ) ; cout d_number endl;14派生类成员的构成派生类的生成经历了3个步骤:吸收基类成员、改造基类成员、添加派生类新成员。吸收基类成员就是继承基类的成员,但不继承基类的构造函数和析构函数。改造基类成员包括两方面,一是通过派生类定义时的继承方式来控制改变基类成员在派

6、生类中的访问控制属性;二是定义同名成员屏蔽基类成员(但是该基类成员仍然存在)。添加新成员就是派生类中定义新的成员,扩展新功能;另外,还要定义自己的构造和析构函数。15派生后访问权限控制三种不同继承方式导致原来具有不同访问属性的的基类成员在派生类中的访问属性也有所不同,具体如下表所示。 继承方式 基类成员公有继承保护继承私有继承公有成员公有保护私有保护成员保护保护私有私有成员派生类新成员不可访问派生类新成员不可访问派生类新成员不可访问16公有继承当类的继承方式为公有继承时,在派生类中,基类的公有成员和保护成员被继承后分别成为派生类的公有成员和保护成员,派生类的新成员可以直接访问他们,而派生类的新

7、成员不能直接访问基类的私有成员。在类外,派生类的对象可以访问继承下来的基类公有成员。17示例:从Point类派生出新的Rectangle类。矩形是由一个点加上长、宽构成,矩形的点具备了Point类的全部特征,同时,矩形自身也有一些特点,这就需要在继承Point类的同时添加新的成员。这两个类的继承关系可以用UML图描述,如下图所示。18+ InitP(xx:float=0,yy:float=0):void+ Move(xOff:float,yOff:float):void+ GetX():float+ GetY():float- X:float- Y:floatPoint+InitR(x:flo

8、at,y:float,w:float,h:float):void+GetH():float+GetW():float- W:float- H:floatRectangle派生类Rectangle基类Point19/rectangle.hclass Point/base classpublic:void InitP(float xx=0, float yy=0) X=xx;Y=yy;void Move(float xOff,float yOff) X+=xOff; Y+=yOff; float GetX()return X;float GetY()return Y;private:float X

9、,Y;class Rectangle: public Point/derived classpublic:void InitR(float x, float y,float w,float h) InitP(x,y); W=w;H=h; float GetH() return H;float GetW() return W;private:float W,H;20/test.cpp#include rectangle.h#include using namespace std;int main()Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,

10、2);coutThe data of rect(X,Y,W,H):endl;coutrect.GetX(),rect.GetY(), rect.GetW(),rect.GetH()endl;return 0; The run result is:The data of rect(X,Y,W,H):5,5,20,1021保护继承当类的继承方式为保护继承时,在派生类中,基类的公有成员和保护成员被继承后全部成为派生类的保护成员,派生类的新成员可以直接访问他们,而派生类的新成员不能直接访问基类的私有成员。在类外,派生类的对象不能访问继承下来的所有基类成员。保护成员具有两面性,对外界而言是不可见的,但对

11、于它的派生类则是可见的。在面向对象程序设计中,若要对基类的某些函数功能进行扩充和改造,就可以采用保护继承的方式,并在派生类中定义同名成员函数来实现。22/rectangle.hclass Point/base classpublic:void InitP(float xx=0, float yy=0) X=xx;Y=yy;void Move(float xOff,float yOff) X+=xOff; Y+=yOff; float GetX()return X;float GetY()return Y;private:float X,Y;class Rectangle: protected

12、Point/derived classpublic:void InitR(float x, float y,float w,float h) InitP(x,y); W=w;H=h; void Move(float xOff, float yOff) Point:Move(xOff,yOff); float GetX() return Point:GetX();float GetY() return Point:GetY();float GetH() return H;float GetW() return W;private:float W,H;23/test.cpp#include rec

13、tangle.h#include using namespace std;int main()Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,2);coutThe data of rect(X,Y,W,H):endl;coutrect.GetX(),rect.GetY(), rect.GetW(),rect.GetH()endl;return 0; The run result is:The data of rect(X,Y,W,H):5,5,20,1024上面例子中,主函数和公有继承例子中的主函数完全相同,但是执行过程有所不同。本例子中的Re

14、ctangle类对象rect调用的函数都是派生类自身的公有成员,因为是保护继承,所以不能访问基类的成员。本例只是修改了派生类的内容,基类和主函数部分根本没有做过任何改动。由此可以看出面向对象程序设计中封装性的优越性,Rectangle类的外部接口不变,内部成员的实现做了改造,根本就没有影响到程序的其他部分,这正是面向对象程序设计重用与可扩充性的一个实际体现。25私有继承当类的继承方式为私有继承时,在派生类中,基类的公有成员和保护成员被继承后全部成为派生类的私有成员,派生类的新成员可以直接访问他们,而派生类的新成员不能直接访问基类的私有成员。在类外,派生类的对象不能访问继承下来的所有基类成员。私

15、有继承方式下,基类成员不能被进一步传递给派生类的派生类,而保护继承方式则允许基类成员被进一步传递给派生类的派生类。26/rectangle.hclass Point/base classpublic:void InitP(float xx=0, float yy=0) X=xx;Y=yy;void Move(float xOff,float yOff) X+=xOff; Y+=yOff; float GetX()return X;float GetY()return Y;private:float X,Y;class Rectangle: private Point/derived class

16、public:void InitR(float x, float y,float w,float h) InitP(x,y); W=w;H=h; void Move(float xOff, float yOff) Point:Move(xOff,yOff);float GetX() return Point:GetX();float GetY() return Point:GetY();float GetH() return H;float GetW() return W;private:float W,H;27/test.cpp#include rectangle.h#include using namespace std;int main()Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,2);coutThe data of rect(X,Y,W,H):endl;coutrect.GetX(),rect.GetY

温馨提示

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

评论

0/150

提交评论