c学习清华大学五PPT学习教案_第1页
c学习清华大学五PPT学习教案_第2页
c学习清华大学五PPT学习教案_第3页
c学习清华大学五PPT学习教案_第4页
c学习清华大学五PPT学习教案_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、会计学1c学习清华大学五学习清华大学五2第1页/共45页3第2页/共45页4例:定义交通工具类,并从交通工具类派生出小汽车例:定义交通工具类,并从交通工具类派生出小汽车类和卡车类类和卡车类 现实世界的事物多种多样,许多事物都存在着层次关系,这种层次关系使我们找到了描述事物的解决方法。如下图是关于交通工具的一个分类层次关系图。第3页/共45页5 类的层次结构图中,下层类是上层类的特殊类; 下层类自动具有上层类的特性,同时也具有自身新的特性; 越往层次结构图的下层,其特性越具体化 这种从上到下的层次结构关系体现了继承与派生的过程; C+面向对象技术也采用了这种继承机制。第4页/共45页6 派生类是

2、在基类的基础上产生的特殊类,派生类自动继承了基类的成员; 派生类具有自身的属性和行为,不然就完全等同于基类,这样就没有必要派生新类; 继承是为了避免代码的重复; 派生是为了使新产生的派生类除具有基类的共性之外,还具有其他个性。 第5页/共45页71.1.派生类的定义格式派生类的定义格式public:公有派生private:私有派生protected:保护派生规定基类成员在派生类中的访问权限缺省情况下表示缺省情况下表示private方式。方式。第6页/共45页8class Student public: void display ( ); private: int num; char name1

3、0; char sex;基类定义基类定义第7页/共45页9第8页/共45页10派生类的生成过程经历了三个步骤: 吸收基类成员吸收基类成员 改造基类成员改造基类成员 添加派生类新成员添加派生类新成员第9页/共45页11在C+的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。 吸收基类成员是一个重用的过程,体现了代码的重用 第10页/共45页12 由于基类的部分成员在派生类中可能不需要却也被继承下来,对这些没有实际需要而被继承的成员,在派生类中需要对其进行改造。改造基类成员包括两个方面:(1) 通过派生的三种继承方式来控制;通过派生的三种继承方式来控制;(2) 通过在派生类中定义同

4、名成员(包括成员通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽在派生类中不起作用函数和数据成员)来屏蔽在派生类中不起作用的部分基类成员。的部分基类成员。第11页/共45页13添加派生类的新成员是继承机制的核心内容。 仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。 第12页/共45页14根据派生类的定义格式可知,有三种继承方式。 public protected private第13页/共45页15由一个类生成的对象,它只能访问类的公有成员,不能访问其它成员:而一个类的成员函数可以访问类中所有成员!第14页/共45页16 当类的继承方式为

5、public(公有)继承属性时,在派生类中,基类的公有成员和保护成基类的公有成员和保护成员被继承后其访问属性没有变化员被继承后其访问属性没有变化,即分别作为派生类的公有成员和保护成员,派生类的成员派生类的成员可以直接访问它们可以直接访问它们。但是,在公有继承时派生派生类的成员无法访问基类的私有成员类的成员无法访问基类的私有成员。 第15页/共45页17特别提示第16页/共45页18第17页/共45页19class student private: int age; protected: char sex; public: int Getage( ); ;class graduatestuden

6、t: public student private: int stunum; public: int Getnum( ); ;公有继承特点:基类的公有成员和保护成员作为派生类的成员时,都保持原有状态,而私有成员仍是私有。第18页/共45页20公有继承第19页/共45页21公有继承第20页/共45页22在派生类中,基类的公有成员和保护成员作为派基类的公有成员和保护成员作为派生类的私有成员,派生类的成员可以直接访问它们生类的私有成员,派生类的成员可以直接访问它们,而派生类的成员无法访问基类的私有成员;而派生类的成员无法访问基类的私有成员;在派生类的外部,派生类的成员和派生类的对象均无法访问基类的全

7、部成员;私有继承之后,全部基类成员在派生类中都成为了私有成员或不可访问的成员,无法进一步派生;私有继承方式一般很少使用。 第21页/共45页23特别提示第22页/共45页242。私有继承第23页/共45页25特点:基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。2 私有继承class student private: int age; protected: char sex; public: int Getage( ); ;class graduatestudent: private student private: int stunum; public: i

8、nt Getnum( ); ;第24页/共45页262 私有继承第25页/共45页272 私有继承第26页/共45页28当类的继承方式为protected继承属性时,在派生类中,基类的公有成员和保护成员均作为派生类的保基类的公有成员和保护成员均作为派生类的保护成员,派生类的成员可以直接访问它们,护成员,派生类的成员可以直接访问它们,而派生类的成员无法访问基类的私有成员。在派生类的外部,派生类的成员和派生类的对象均无法访问基类的全部成员。如果基类只进行了一次派生,则保护继承和私有继承的功能完全相同,但保护继承可以进一步派生,保护继承可以进一步派生,而私有继承则不可以,两者具有实质性差别而私有继承

9、则不可以,两者具有实质性差别。 第27页/共45页29第28页/共45页30 基类的所有公有成员和保护成员都作为派生类的保护成员,并且只能被它的派生类成员函数访问,基类的私有成员仍是私有的。保护继承保护继承class student private: int age; protected: char sex; public: int Getage( ); ;class graduatestudent: protected student private: int stunum; public: int Getnum( );第29页/共45页311.3 保护继承保护继承第30页/共45页32vo

10、id main( ) graduatestudent zh; /生成派生类对象 /( );/ 即:即:student:Getage( ); 不能不能访问 ( ); /访问派生类中的公开成员 /cout; /即:即:student:sex,error 私有成员私有成员 /cout; /error 私有成员私有成员 /cout; /即:即:student:age,error1.3 保护继承保护继承第31页/共45页33 公有成公有成员员 私有成私有成员员 保护成保护成员员公有继承公有继承公有公有不可访问不可访问保护保护私有继承私有继承私有私有不可访问不可访问私有私有保护继承保护继承保护保护不可访问

11、不可访问保护保护第32页/共45页34基类的构造函数的功能是创建基类对象并进行初始化,而析构函数的功能在基类对象生存期结束时对基类对象进行必要的清理工作。在派生类的生成过程中,派生类将产生新的成员,对新增数据成员的初始化需要由派生类自身的构造函数完成,而对派生类对象的清理工作需要由相应的析构函数完成。第33页/共45页35派生类的数据成员既包括基类的数据成员,也包括派生类新增数据成员。派生类构造函数在对派生类对象进行初始派生类构造函数在对派生类对象进行初始化时需要对基类数据成员、新增数据成员和内化时需要对基类数据成员、新增数据成员和内嵌对象成员进行初始化。嵌对象成员进行初始化。 在定义派生类的

12、构造函数时除了对自己的数据成员进行初始化外,还必须调用必须调用基类的构造函数初始化基类的数据成员 第34页/共45页36派生类名:派生类名派生类名:派生类名 (总参数表总参数表):基类名(:基类名(参数表参数表1),对象成员名对象成员名(参数表参数表2) 派生类新增成员的初始化派生类新增成员的初始化; 第35页/共45页37派生类构造函数的调用顺序如下:基类的构造函数对象成员类的构造函数(若有)派生类构造函数注意:1、若基类中未定义带参数构造函数,则派生类构造函数的定义中可以省略对基类构造函数的调用。2、若基类的构造函数使用了参数,则派生类必须定义构造函数,为基类构造函数提供参数。第36页/共

13、45页38#include class Basepublic: Base()coutBase Constructorendl;class DeriveA:public Basepublic: DeriveA()coutDeriveA Constructorendl;class DeriveB:public DeriveApublic: DeriveB()coutDeriveB Constructorendl;void main() DeriveB B;第37页/共45页39#includeclass Baseprivate: int n; double a;public: Base(int x

14、1,double x2) n=x1;a=x2; coutCall A Destructorendl; coutn=nendl; couta=aendl; Base();第38页/共45页40class Derive:public Baseprivate: int m; double b;public: Derive(int x1=10,double x2=20,int y1=218,double y2=288.8):Base(x1,x2),m(y1),b(y2) coutCall B Destructorendl; coutm=mendl; coutb=bendl; Derive();void

15、 main() Derive obj1;第39页/共45页41class data int x; public: data(int x) data:x = x; coutclass datan; ; class A data d1; public: A(int x) : d1(x) coutclass An;运行结果运行结果:class dataclass Aclass dataclass Bclass Cclass B : public A data d2; public: B(int x) : A(x),d2(x) coutclass Bn;class C : public B publi

16、c: C(int x) : B(x) coutclass Cn; ;void main( ) C object(5); 派生类的构造函数派生类的构造函数第40页/共45页42,因此在执行派生类的析构函数时,基类的析构函数也将被调用。析构函数调用的顺序与构造函数相反.2派生类的析构函数派生类的析构函数class M public: M()m1=m2=0; M(int i,int j)m1=i;m2=j; void print() coutm1,m2,; M() coutMs destructor called.n; private: int m1,m2; ;第41页/共45页43 void pr

17、int( ) M:print( );coutnendl; N( ) c o u t N s d e s t r u c t o r called.n; private: int n; 5,6,75,6,7-2,-3,-4-2,-3,-4Ns destructor called.Ms destructor called.Ns destructor called.Ms destructor called.N:N(int i,int j, int k):M(i,j),n(k) void main( ) N n1(5,6,7),n2(-2,-3,-4); n1.print(); n2.print(); 第42页/共45页44#includeclass BaseAint x;public:BaseA(int i)x=i;coutConstructing o

温馨提示

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

评论

0/150

提交评论