c计算机基础教学研究室_第1页
c计算机基础教学研究室_第2页
c计算机基础教学研究室_第3页
c计算机基础教学研究室_第4页
c计算机基础教学研究室_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

计算机基础教学研究主要内派生类成多重继继承与组继面向对象程序设计有4个主要特点抽象、封装、要较好地进行面向对象程序设计,还必须了解面向对象程序设计另外两个重要特征——继承性和多态性。在本章中主要介绍有关继承的知识,在第12章中将介绍多态性。面向对象技术强调软件的可重用性(softwarereusability)。C++语言提供了类的继承机制,解继承与派生的概

基类(父类计算机系人教职教职学教行政管教行政管理人教本科研究系主系主(子类(子类基类与派生类的对应关单继多继多重派多层派一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。通过继承,一个新建子类从已有的父类那里获得父类的特性。(遗传)从另一角度说,从已有的类(父类)子类,称为类的派生类的继承是用已有的类来建立专用类的编程技术。派生类继承了基类的所有数据成员和成员函数,并可以对成员作必要的增加或调整。一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对而言的。(singleinheritance),这种继承关系所形成的层次派生类的声明方class派生类名:继承方式基类{派生类新增加的}假设已经声明了一个基类Studnt,在此基础上通过单继承建立一个派生类Studnt1:classStudent1:publicStudent//声明基类是voiddisplay_1 //新增加的成员函{cout<<″age:″<<age<<endl;cout<<″address:″<<addr<<endl;}int //新增加的数string //新增加的数据成继承方三种继承方不同继承方式的影响主要体现在1、派生类成员对基类成员的访问控制2、派生类对象对基类成员的访问控制private(私有的)派生类的构实际上,并不是把基类的成员和派生类自己增加的成员简单地加在一起就成为派生类。构造一个派生类包括以下3部分工作:(1)从基类接收成员。派生类把基类全部的成员(不包括构造函数和析构函数)接收过来,也就是说是没有选择的,不能选择接收其中一部分成员,而舍弃另一部分成员。要求我们根据派生类的需要慎重选择基类,使冗余量最小*(2)调整从基类接收的成员。接收基类成员是程序人员不能*(3)在声明派生类时增加的成员。这部分内容是很重要的,它体现了派生类对基类功能的扩展。要根据需要仔细考虑应当增加哪些成员,精心设计。此外,在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承的。派生类成员的访问属公有继承基类的pulic和protected成员的访问属性在派生类中保持不变,但基类的private成员不可访问。派生类中的成员函数可以直接访问基类中的public通过派生类的对象只能访问基类的public派派生类对象(类外定义基基私有成}

派生私有成}有继承举class //基类Point类的声 Point(floatxfloatvoidMove(floatxOff,floatfloatGetX(){returnX;}floatGetY(){returnprivate:私有数据成员floatX,Y;classRectanglepublicPoint//{ //新增公有函数成Rectangle(floatx,floaty,floatw,floatfloatGetH(){returnH;}floatGetW(){returnW;}private://新增私有数据成floatint Rectanglerect(2,3,20,10); return0;}运行结果派生类成员的访问属私有继承派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能访问基类的private通过派生类的对象不能访问基类中的任何成员,基类原有的外部接口被派生类封装和隐蔽起来。派派生类对象(类外定义基基私有成}派生私有成}图对于不需要再往下继承的类的功能可以用私有继承方式把它隐蔽起来,这样,下一层的派生类无法访问它的任何成员。例:私有继承举classRectangleprivate //派生类声 //新增外部接Rectangle(floatx,floaty,floatw,float voidMove(floatxOff,floatyOff)floatGetX(){returnPoint::GetX();}floatGetY(){returnPoint::GetY();}floatGetH(){returnH;}floatGetW(){returnW;}private://新增私有数floatint Rectanglerect(2,3,20,10);return0;}派生类成员的访问属保护继承*保护成员的意思是不能被外界引用,但可以被派生派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能访问基类的private通过派生类基基}}派生类对象(类外定义类中引用保护成员class //基类Point类的声 //公有函数成Point(floatx=0,floatvoidMove(floatxOff,floatfloatGetX(){returnX;}floatGetY(){return 保护数据floatclassRectangleprotected //派生类 //新增外部接Rectangle(floatx,floaty,floatw,float //访问基类公有成voidMove(floatxOff,floatyOff){Point::Move(xOff,yOff);}floatGetX(){returnPoint::GetX();}floatGetY(){returnPoint::GetY();}floatGetH(){returnH;}floatGetW(){returnW;} float在派生类中引用保护成int Rectanglerect(2,3,20,10);return0;}访问权限概public,private和protected是三种常用的继承方式,继承方式的同决定了派生类对基类成员的派生类的继基

说如果需要在派生类中引用基类的某些成员,应当将基类的这些成员声明为protetd,而不要声明为private。如果善于利用保护成员,可以在类的层次结构中找到数据共享与成员隐蔽之间的结合点。既可实现某些成员的隐蔽,又可方便地继承,能实现代码重用与扩充。#include<iostream.h>classAvoidA(intj1;

classC:publicvoidf3();C()intj3;int

f2()能否访问能访问f1()、j1,不能访问 b能否访问能访问f1(),不能访问i1和 f3()能否访问f2()、i2和以及f1(),j1和int classB:publicvoidf2();B()intj2;int

void{ABC}

f3能访问f2()和j2,以及f1()j1,但不能访问i1和例11.4多级派生的访问属性 //基inti;voidf2();intj;intk;classBpublic //public方voidf3();voidf4();intm;classCprotected //protected方voidf5();intn;派生类的构造函数和析构函*用户在声明类时可以不定义构造函数,系统会自动设置一个默认的构造函数,在定义类对象时会自动调用这个默认的构造函数。这个构造函数实际上是一个空函数,不执行任何操作。如果需要对类中的数据成员初始化,应自己定义构造函数。构造函数的主要作用是对数据成员初始化。在设计派生类的构造函数时,不仅要考虑派生类所增加的数据成员的初始化,还应当考虑基类的数据成员初始化。也就是说,希望在执行派生类的构造函数时,使派生类的数据成员和基类的数据成员同时都被初始化。解决这个问题的思路是:在执行派生类的构造函数时简单的派生类的构造函任何派生类都包含基类的成员,简单的派生类只有一个基类,而且只有一级派生。例11.5简单的派生类的构造函#include<iostream>usingnamespacestd;class //声明基类Student(intn,stringnam,char //基类构造函sex=s;}~Student(){} intnum;stringname;charsex;classStudent1:public //声明派生类 //派生类的公Student1(intn,stringnam,chars,inta,string// }voidshow({cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;cout<<″age:″<<age<<endl;cout<<″address:″<<addr<<endl<<endl;}~Student1( //派生类析构函 intage;string注意派生类构造函数首行的写法的一般形式为派生类构造函数名(总参数表列):基类构造函数名(参数表列{派生类中新增数据成员初始化语句intmain({Student1stud1(10010,″Wang-li″,′f′,19,″115BeijingRoad,Shanghai″);Student1stud2(10011,″Zhang-fun″,′m′,21,″213ShanghaiRoad,Beijing″);stud1.show(); stud2.show //输出第二个学生的数return}address:115Beijingaddress:213Shanghai可以将构造函数改写为以下形式Student1(intn,stringnam,chars,inta,string这样函数体为空,更显得简单在建立一个对象时,执行构造函数的顺序是①派生类构造函数先调用基类构造函数~Student1,再执行其基类析构函数~Student(11.5.3多层派生时的构造函一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构。在上面叙述的基础上,不难写出在多级派生情况下派生类的构造函数。例11.7多级派生情况下派生类的构造函数#include<iostream>usingnamespacestd;classStudent//声明基 //公用部Student(intn,stringnam //}voiddisplay //输出基类数据成} //保护部intnum; stringname;classStudent1:public //声明公用派生类Student1(intn,charnam[10],inta):Student(n,nam)//派生类构造函{age=a; //在此处只对派生类新增的数据成员初始voidshow( //输出num,name和{display(); cout<<″age:″<<age<<endl;} //派生类的私有数int //增加一个数classStudent2:public //声明间接公用派生类//下面是间接派生类构Student2(intn,stringnam,inta,intvoidshow_all( // show(); }int //增加一个数intmain({Student2stud.show_all(); return0;}其派生关系如图11.13所示初始化的顺序是①先初始化基类的数据成员num和name②再初始化Student1的数据成员age③最后再初始化Student2的数据成员scorevoid{Cylinder1p;}classCylinder1:publicvoidcout<<"圆柱高}voidset(doublex1,doubley1,doubler1,double{Circle::set(x1,y1,r1);double{doubleR=getr();}classCircle{void{cout<<"圆心cout<<endl<<"半径}voidset(doublex1,doubley1,double{x=x1;y=y1;r=r1; doublegetr(){returnr;}double[例11-(11)]多重继声明多重继承的方如果已声明了类A、类B和类C,可以声明多重继承的派生类classD:publicA,privateB,protected{类D新增加的成员是多重继承的派生类,它以公有继承方式继承A类,以私有继承方式继承B类,以保护继承方式继承C类。按不同的继承方式的规则继承C的属性,确定各基类的成员在派生类中的访问权限。多继承派生类的构造函多重继承派生类的构造函数形式与单继承时的构造函数形式基本相同,只是在初始表中包含多个基类构造函数。如:派生类构造函数名(总参数表列):基类1构造函数(参数表列基类2构造函数(参数表列基类3构造函数{派生类中新增数据成员初始化语句派生类构造函数的执行顺序同样为先调用基类的调用基类构造函数的顺序是按照声明派生类时父基类派生的顺序。如上为:基类1、基类2、基类311.8继承与组在一个类中以另一个类的对象作为数据成员的,称为类的组合(compn。例如,声明Professor(教授)类是ar(教师)类的派生类,另有一个类ate(生日),包含,mont,da等数据成员。可以将教授生日的信息加入到Professor类的声明中。如voiddisplay();intnum;charname[20];charsex;)//{num=n;})//{cout<<"学号:"<<num<<“姓名:"<<name<<“性别classBirthDate定义生日{//BirthDate类构造函voiddisplay();intyear;intmonth;intday;voidBirthDate::display()//BirthDate类输出函{cout<<"出生日classProfessor:public //教授voiddisplay();charproGrade; BirthDatebirthday; Professor::Professor(intn,charnam[20],chars,inty,intm,in

温馨提示

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

评论

0/150

提交评论