《继承与派生 》ppt课件_第1页
《继承与派生 》ppt课件_第2页
《继承与派生 》ppt课件_第3页
《继承与派生 》ppt课件_第4页
《继承与派生 》ppt课件_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

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

文档简介

1、电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT第第1111章章 承继与派生承继与派生第第1212章章 多态性与虚函数多态性与虚函数第第1313章章 输入输出流输入输出流第第1414章章 C+ C+工具工具第第4 4篇面向对象的程序设计篇面向对象的程序设计电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT第第1111章章 承继与派生承继与派生11.1 11.1 承继与派生的概念承继与派生的概念11.2 11.2 派生类的声明方式派生类的声明方式11.3

2、11.3 派生类的构成派生类的构成11.4 11.4 派生类成员的访问属性派生类成员的访问属性11.5 11.5 派生类的构造函数和析构函数派生类的构造函数和析构函数11.6 11.6 多重承继多重承继11.7 11.7 基类与派生类的转换基类与派生类的转换11.8 11.8 承继与组合承继与组合11.9 11.9 承继在软件开发中的重要意义承继在软件开发中的重要意义电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT面向对象程序设计有面向对象程序设计有4 4个主要特点个主要特点: : 笼统笼统封装封装承继承继多态性多态性面向

3、对象技术强调软件的可重用性面向对象技术强调软件的可重用性(software (software reusability) reusability) 。C+C+言语提供了类的承继机制,处言语提供了类的承继机制,处理了软件重用问题。理了软件重用问题。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT在在C+C+中可重用性是经过承继中可重用性是经过承继(inheritance)(inheritance)这一这一机制来实现的。承继是机制来实现的。承继是C+C+的一个重要组成部分。的一个重要组成部分。在在C+C+中,所谓中,所谓“承继

4、就是在一个已存在的类承继就是在一个已存在的类的根底上建立一个新的类。的根底上建立一个新的类。见图见图11.111.1表示。表示。11.1 11.1 承继与派生的概念承继与派生的概念电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT已存在的类已存在的类( (例如例如“马马) )称为称为“基类基类(base class)(base class)或或“父类父类(father class)(father class)。新建立的类。新建立的类( (例如例如“公马公马) )称为称为“派生类派生类(derived class)(deriv

5、ed class)或或“子子类类(son class)(son class)。见图。见图11.211.2表示。表示。 图11.1 图11.2电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT一个派生类只从一个基类派生,这称为单承继一个派生类只从一个基类派生,这称为单承继(single inheritance)(single inheritance),这种承继关系所构成的层,这种承继关系所构成的层次是一个树形构造,见以下图。次是一个树形构造,见以下图。箭头表示承继的方向,从派生类指向基类。箭头表示承继的方向,从派生类指向基类。

6、电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT一个派生类不仅可以从一个基类派生,也可以从一个派生类不仅可以从一个基类派生,也可以从多个基类派生。一个派生类有两个或多个基类的称多个基类派生。一个派生类有两个或多个基类的称为多重承继为多重承继(multiple inheritance)(multiple inheritance)。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT关于基类和派生类的关系:派生类是基类的详细化,而基类那么是派生类的笼统。电子与

7、信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT声明派生类的普通方式为:声明派生类的普通方式为:class class 派生类名派生类名: : 承继方式承继方式 基类名基类名 派生类新添加的成员派生类新添加的成员 ; ;承继方式包括承继方式包括: public(: public(公用的公用的),private(),private(私有的私有的) )和和protected(protected(受维护的受维护的) ),假设不写此项,那么默以,假设不写此项,那么默以为为private(private(私有的私有的) )。11.2 11

8、.2 派生类的声明方式派生类的声明方式电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT派生类分为两大部分派生类分为两大部分: : 一部分是从基类承继来的成员一部分是从基类承继来的成员另一部分是在声明派生类时添加的部分另一部分是在声明派生类时添加的部分每一部分均分别包括数据成员和成员函数。每一部分均分别包括数据成员和成员函数。11.3 11.3 派生类的构成派生类的构成电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT编制编制派生派生类时类时可分可分四步四

9、步 吸收基类的成员吸收基类的成员 改造基类成员改造基类成员 开展新成员开展新成员 重写构造函数与析构函数重写构造函数与析构函数 不论是数据成员,还是函数成员,除不论是数据成员,还是函数成员,除构造函数与析构函数外全盘接纳构造函数与析构函数外全盘接纳 声明一个和某基类成员同名的新成员,派声明一个和某基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称生类中的新成员就屏蔽了基类同名成员称为同名覆盖为同名覆盖override 派生类新成员必需与基类成员不同名,它的派生类新成员必需与基类成员不同名,它的参与保证派生类在功能上有所开展。参与保证派生类在功能上有所开展。 构造一个派生类包括以下构造

10、一个派生类包括以下4 4部分任务部分任务: :电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT派生类对象构造派生类对象构造 对于下面的承继关系:对于下面的承继关系:class Father int a,b;public:/ 成员函数成员函数;class Son:public Father int c;public: / 成员函数成员函数;基类对象子类对象子类对象空间总是不小于基类对象cabab基类部分基类部分子类添加部分子类添加部分电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOL

11、OGY DEPARTMENT11.4 11.4 派生类成员的访问属性派生类成员的访问属性承继可以公有承继,维护承继和私有承继。承继可以公有承继,维护承继和私有承继。公有承继是普通承继,基类可以为大多数运用效力。公有承继是普通承继,基类可以为大多数运用效力。也可以反复承继。也可以反复承继。维护承继是维护承继是“单传承继,只承继给本人的后代,单传承继,只承继给本人的后代,运用是以子孙的公有成员函数来对外展开效力的。运用是以子孙的公有成员函数来对外展开效力的。私有承继是私有承继是“绝版承继,该基类只承继直接的子绝版承继,该基类只承继直接的子类,而不思索让子类再承继下去。类,而不思索让子类再承继下去。

12、电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTpublicpublic承继:承继:基类的基类的publicpublic成员成员, , 在派生类中成为在派生类中成为publicpublic成员成员基类的基类的protectedprotected成员成员, , 在派生类中成为在派生类中成为protected protected 成员成员基类的基类的privateprivate成员成员, , 在派生类中成为不可直接运用的成员在派生类中成为不可直接运用的成员11.4.1 11.4.1 公有承继公有承继 公有基类的成员公有基类的成

13、员私有成员私有成员公有成员公有成员 保护成员保护成员在公有派生类中的访问属性在公有派生类中的访问属性不可访问不可访问公有公有保护保护表表11.1公用基类在派生类中的访问属性公用基类在派生类中的访问属性电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例:下面定义了两个具例:下面定义了两个具有单承继关系的类有单承继关系的类A和和B,其中,其中,A为基类,为基类,B为派生类:为派生类:class Aint x,y;public:void f();void g();class B : public Aint z;public:vo

14、id h();电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT在在C+C+中对派生类有以下几点规定:中对派生类有以下几点规定:派生类除了拥有基类的一切成员基类的构造函数和派生类除了拥有基类的一切成员基类的构造函数和赋值操作符重载函数除外外,也可以具有新的成员。赋值操作符重载函数除外外,也可以具有新的成员。class Aint x,y;public:void f();void g();class B : public Aint z;public:void h();void main()B b;b.f( ); /A类中的类中的

15、 fb.g( ); /A类中的类中的gb.h( ); /B类中的类中的h电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu派生类的定义用于描画派生类与基类的差别。派生派生类的定义用于描画派生类与基类的差别。派生类中可以给出新的成员,也可以对基类的成员进展重类中可以给出新的成员,也可以对基类的成员进展重定义。假设在派生类中对基类的某个成员进展重定义,定义。假设在派生类中对基类的某个成员进展重定义,那么在派生类中对该成员的访问是针对派生类中重定那么在派生类中对该成员的访问是针对派生类中重定义的成员。义的成员。class B :

16、 public Aint z;public:void f();void h() f( ); /B类中的类中的f g( ); /A类中的类中的g;void main( )B b;b.f( ); /B类中的类中的 fb.g ( ); /A类中的类中的gb.h( ); /B类中的类中的h电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu派生类成员名的作用域嵌套在基类的作用域中,对派生类成员名的作用域嵌套在基类的作用域中,对于基类的一个成员,假设派生类中没有定义与其同名于基类的一个成员,假设派生类中没有定义与其同名的成员,那么该成

17、员名在派生类的作用域内可见,否的成员,那么该成员名在派生类的作用域内可见,否那么,该成员名在派生类的作用域内不直接可见,假那么,该成员名在派生类的作用域内不直接可见,假设要运用,必需用基类名受限。例:设要运用,必需用基类名受限。例:class B : public Aint z;public:void f( );void h( ) f( ); /B类中的类中的f A:f( ) /A类中的类中的f;void main( )B b;b.f( ); / B 类中的类中的 fb.A:f( ); /A类中的类中的f电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNO

18、LOGY DEPARTMENTu即使派生类中定义了与基类同名但参数不同的成员即使派生类中定义了与基类同名但参数不同的成员函数,基类的同名函数在派生类中的作用域中也是不函数,基类的同名函数在派生类中的作用域中也是不直接可见的。例:直接可见的。例:class B : public Aint z;public:void f(int);void h( ) f(1); /Ok f( ); / A:f( ) / Ok;void main( )B b;b.f(1); / Okb.f( ); / b.A:f( ); / Ok电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECH

19、NOLOGY DEPARTMENTu定义派生类时一定要见到基类的定义,否那么编译定义派生类时一定要见到基类的定义,否那么编译程序无法确定派生类对象需占多大内存空间以及派生程序无法确定派生类对象需占多大内存空间以及派生类中对基类成员的访问能否合法。例:类中对基类成员的访问能否合法。例:class A;class B : public Aint z;public:void h( ) g( ); /Error没有没有g的原型的原型;B b; / Error无法确定无法确定 b 所需空间所需空间电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPA

20、RTMENTu假设在派生类中没有显式阐明,基类的友元不是派假设在派生类中没有显式阐明,基类的友元不是派生类的友元;假设基类是另一个类的友元,而该类没生类的友元;假设基类是另一个类的友元,而该类没有显式阐明,那么派生类也不是该类的友元。有显式阐明,那么派生类也不是该类的友元。u派生类不能直接访问基类的私有成员,必需求经过派生类不能直接访问基类的私有成员,必需求经过基类的非私有成员函数来访问基类的私有成员。例:基类的非私有成员函数来访问基类的私有成员。例:class A int x,y; public: void f( ); void g( )x;class B : public Aint z;p

21、ublic:void h( )x /Error, x为基类的私有成员为基类的私有成员g( ); /Ok, 经过函数经过函数g访问基类的私有成员访问基类的私有成员x;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT在派生类中对基类成员的访问在派生类中对基类成员的访问一个类有两种用户:实例用户和派生类。例:一个类有两种用户:实例用户和派生类。例:一个类存在两个对外接口一个类存在两个对外接口给实例用户运用:由类的给实例用户运用:由类的publicpublic成员构成成员构成提供应派生类运用:由类的提供应派生类运用:由类的publ

22、icpublic和和protectedprotected成员成员构成构成class A ;class B : public A /派生类派生类; void f( )/实例用户实例用户 A a;class A protected:int x,y; public:void f( );class B : public A /派生类派生类 void h() x / Ok y / Ok f( ); / Ok; void f( )/实例用户实例用户 A a;a.x / Errora.y / Errora.f( ); / Ok;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & T

23、ECHNOLOGY DEPARTMENTu类的聚集:一个类只需一个接口,即类的实例用户类的聚集:一个类只需一个接口,即类的实例用户接口。例:以承继和聚集实现的代码重用。接口。例:以承继和聚集实现的代码重用。class A public :void f();void g();class B : public A public :void h(); class B A a;public :void f()a.f();void g()a.g();void h();电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu承继实现子类型,

24、派生类可以看成基类的子类型。承继实现子类型,派生类可以看成基类的子类型。u子类型的作用:发给基类对象的音讯也能发给派生子类型的作用:发给基类对象的音讯也能发给派生类对象,以及基类的对象标识可以标识派生类对象。类对象,以及基类的对象标识可以标识派生类对象。class A public :void f();class B : public A public :void g(); 以下操作合法:以下操作合法:A a,*p;B b,*q;b.f();a=b;p=&b;以下操作非法:以下操作非法:b=a; /Error b有不确定的成员数据有不确定的成员数据q=&a; /Error用用b

25、去改动去改动a的形状,属于的形状,属于b但不属于但不属于a的成员将被忽略的成员将被忽略A类指针类指针p指向指向B类对象类对象b电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.1 访问公有基类的成员。访问公有基类的成员。Class Student/声明基类声明基类public: /基类公用成员基类公用成员 void get_value( ) cinnumnamesex; void display( ) cout num: numendl; cout name: nameendl; cout sex: sexendl

26、; private : /基类私有成员基类私有成员 int num; char name8; char sex; class Student1: public Student /以以public方式声明派生类方式声明派生类Student1电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT public:void display_1( )cout num: numendl; cout name: nameendl; /援用基类的私有成员,错误援用基类的私有成员,错误 cout sex: sexendl; cout age: a

27、geendl; /援用派生类的私有成员,正确援用派生类的私有成员,正确 cout address: addrendl; /援用派生类私有成员,正确援用派生类私有成员,正确private: int age; char addr12; ;结论:结论:由于基类的私有成员对派生类来说是不可访问的,由于基类的私有成员对派生类来说是不可访问的,因此在派生类中的因此在派生类中的display_1display_1函数中直接援用基类函数中直接援用基类的私有数据成员的私有数据成员numnum,namename和和sexsex是不允许的。是不允许的。只能经过基类的公用成员函数来援用基类的私有数只能经过基类的公用成

28、员函数来援用基类的私有数据成员。据成员。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT可以将派生类可以将派生类Student1的声明改为:的声明改为:class Student1: public Student /以以public方式声明派生类方式声明派生类Student1public:void display_1( ) cout age: ageendl; /派生类的私有成员,正确派生类的私有成员,正确cout address: addrageaddr;private:int age; string addr;电子与信

29、息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT可以这样写可以这样写main函数函数: int main( )Student1 stud; stud. get_value ( );stud. get_value_1 ( );stud.display( ); stud.display_1(); return 0; void display_1( ) display( ) ;cout“ age: “ageendl; cout“ address: “addrageaddr;电子与信息工程系电子与信息工程系COMPUTER SCIENCE

30、 & TECHNOLOGY DEPARTMENTprivateprivate承继:承继:基类的基类的publicpublic成员成员, , 在派生类中成为在派生类中成为private private 成员成员基类的基类的protectedprotected成员成员, , 在派生类中成为在派生类中成为privateprivate成员成员基类的基类的privateprivate成员成员, , 在派生类中成为不可直接运用的成员在派生类中成为不可直接运用的成员11.4.2 11.4.2 私有承继私有承继 私有基类的成员私有基类的成员私有成员私有成员公有成员公有成员 保护成员保护成员在私有派生类

31、中的访问属性在私有派生类中的访问属性不可访问不可访问私有私有私有私有表表11.1私有基类在派生类中的访问属性私有基类在派生类中的访问属性电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT图11.7表示了各成员在派生类中的访问属性。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.2 11.2 将例将例11.111.1中的公用承继方式改为用私有承继方中的公用承继方式改为用私有承继方式式( (基类基类StudentStudent不改不改) )。可以写

32、出私有派生类如下可以写出私有派生类如下: :class Student1: private Student/class Student1: private Student/用私有承继方式用私有承继方式声明声明public:public:void display_1( ) void display_1( ) coutcout“age: age: “ageendl; ageendl; coutcout“address: address: “addrendl;addrendl; private:private:int age; int age; char addr12;char addr12;int

33、 main( )Student1 stud1; stud1.display(); /错误错误stud1.display_1( ); /正确正确stud1.age=18; /错误错误return 0; 电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT结论结论: : (1) (1) 不能经过派生类对象不能经过派生类对象( (如如stud1)stud1)援用从援用从私有基类承继过来的任何成员。私有基类承继过来的任何成员。(2) (2) 派生类的成员函数不能访问私有基类的派生类的成员函数不能访问私有基类的私有成员,但可以访问私有基

34、类的公用成员。私有成员,但可以访问私有基类的公用成员。 在派生类外不能经过派生类对象调用私在派生类外不能经过派生类对象调用私有基类的公用成员函数,但可以经过派生类有基类的公用成员函数,但可以经过派生类的成员函数调用私有基类的公用成员函数的成员函数调用私有基类的公用成员函数( (此时它是派生类中的私有成员函数,可以此时它是派生类中的私有成员函数,可以被派生类的任何成员函数调用被派生类的任何成员函数调用) )。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT可将上面的私有派生类的成员函数定义改写为可将上面的私有派生类的成员函数

35、定义改写为void display_1( )display(); /调用基类的公用成员函数调用基类的公用成员函数 coutage: ageendl; /派生类的私有数据成员派生类的私有数据成员coutaddress: addrendl; /派生类的私有数据成员派生类的私有数据成员main函数可改写为函数可改写为int main( )Student1 stud1; stud1.display_1( ); /Student1类的公用函数类的公用函数 return 0;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT由于私有派生

36、类限制太多,运用不方便,普通不常运用。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT11.4.3 11.4.3 维护成员和维护承继维护成员和维护承继protected protected 承继:承继:基类的基类的publicpublic成员成员, , 在派生类中成为在派生类中成为protected protected 成员成员基类的基类的protectedprotected成员成员, , 在派生类中成为在派生类中成为protected protected 成员成员基类的基类的privateprivate成员成员, , 在

37、派生类中成为不可直接运用的成员在派生类中成为不可直接运用的成员基类中的成员基类中的成员 在公有派生类在公有派生类在私有派生类在私有派生类在保护派生类在保护派生类私有成员私有成员不可访问不可访问不可访问不可访问不可访问不可访问公有成员公有成员公有公有私有私有保护保护保护成员保护成员保护保护私有私有保护保护表表11.3基类成员在派生类中的访问属性基类成员在派生类中的访问属性电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT维护成员可以被派生类的成员函数援用。但不能被维护成员可以被派生类的成员函数援用。但不能被实例函数援用。实例函

38、数援用。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例:例:class B1 int a; void f( )couta; public: int b; void g( )couta; protected: int c; void k( )couta; ;对派生类:对派生类:class B2: public B1public: void df( ) couta; / coutb; coutc; f( ); / g( ); k( ); ;对实例函数对实例函数void main( ) B1 b1; coutb1.a;/ c

39、outb1.b; coutb1.c; / b1.f( ); / b1.g( ); b1.k( ); / 电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT(1) (1) 在派生类中,成员有在派生类中,成员有4 4种不同的访问属性种不同的访问属性: : 派生类中的成员派生类中的成员在派生类中在派生类中 在派生类外在派生类外在下层公用派生类中在下层公用派生类中公用的成员公用的成员可以可以可以可以可以可以受保护的成员受保护的成员可以可以不可以不可以可以可以私有的成员私有的成员可以可以不可以不可以不可以不可以不可访问的成员不可访问的

40、成员不可以不可以不可以不可以不可以不可以表表11.411.4派生类中的成员的访问属性派生类中的成员的访问属性电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.3 在派生类中援用维护成员。在派生类中援用维护成员。#include #include using namespace std;class Studentpublic: void display( ); protected :int num;string name;char sex;void Student:display( ) coutnum: numend

41、l; coutname: nameendl; coutsex: sexendl; class Student1: protected Studentpublic:void display1( ); private:int age; char addr 12; ;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTvoid Student1:display1( ) /定义派生类公用成员函数定义派生类公用成员函数 coutnum: numendl; /基类的维护成员,合法基类的维护成员,合法 coutname: nameendl;

42、 coutsex: sexendl; coutage: ageendl; /派生类的私有成员,合法派生类的私有成员,合法 coutaddress: addrendl; int main( ) Student1 stud1; stud1.display1( ); stud1.num=10023; / 错误,外界不能访问维护成员错误,外界不能访问维护成员return 0; 电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT在派生类的成员函数中援用基类的维护成员是合法的。维护成员和私有成员不同之处,在于把维护成员的访问范围扩展到派

43、生类中。留意: 在程序中经过派生类Student1的对象stud1的公用成员函数display1去访问基类的维护成员和sex,不要误以为可以经过派生类对象名去访问基类的维护成员。私有承继和维护承继方式很容易搞错,普通不常用。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT 11.4.4 11.4.4 多级派生时的访问属性多级派生时的访问属性图11.9假设有图11.9所示的派生关系: 类A为基类,类B是类A的派生类,类C是类B的派生类,那么类C也是类A的派生类。类B称为类A的直接派生类,类C称为类A的间接派生

44、类。类A是类B的直接基类,是类C的间接基类。在多级派生的情况下,各成员的访问属性仍按以上原那么确定。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.4 多级派生访问属性。多级派生访问属性。class Apublic: int i; protected: void f2( ); int j; private: int k;class B: public A public:void f3( ); protected:void f4( ); private: int m;class C: protected Bpubl

45、ic:void f5( ); private: int n;class B:public: void f3( ); int i;protected: void f4( ); void f2( ); int j;private: int m;class C:public: void f5( );protected: void f4( ); void f2( ); int j; void f3( ); int i;private: int n;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu在派生类中是不能访问基类的私有成员

46、的,私有成员只能被本类的成员函数所访问,毕竟派生类与基类不是同一个类。u在多级派生时:u采用公用承继方式,那么直到最后一级派生类都能访问基类的公用成员和维护成员。u采用私有承继方式,经过假设干次派生之后,基类的一切的成员曾经变成不可访问的了。u采用维护承继方式,在派生类外是无法访问派生类中的任何成员的。经过多次派生后,很难记住哪些成员可以访问,哪些成员不能访问。常用的是公用承继常用的是公用承继!电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT11.5 11.5 派生类的构造函数和析构函数派生类的构造函数和析构函数用户在声明

47、类时可以不定义构造函数,系统会自用户在声明类时可以不定义构造函数,系统会自动设置一个默许的构造函数。动设置一个默许的构造函数。在设计派生类的构造函数时,希望在执行派生类在设计派生类的构造函数时,希望在执行派生类的构造函数时,使派生类的数据成员和基类的数据的构造函数时,使派生类的数据成员和基类的数据成员同时都被初始化。成员同时都被初始化。处理这个问题的思绪是处理这个问题的思绪是: 在执行派生类的构造函数在执行派生类的构造函数时,调用基类的构造函数。时,调用基类的构造函数。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例1

48、1.5 简单的派生类的构造函数。简单的派生类的构造函数。#include #includeusing namespace std;class Student/声明基类声明基类Student public: Student(int n,string nam,char s) /基类构造函数基类构造函数 num=n; name=nam; sex=s; Student( ) /基类析构函数基类析构函数protected: /维护部分维护部分 int num; string name; char sex ; ;11.5.1 11.5.1 简单的派生类的构造函数简单的派生类的构造函数电子与信息工程系电子与

49、信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTclass Student1: public Student public: Student1(int n,string nam, char s, int a,string ad): Student(n,nam,s) age=a; addr=ad; void show( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl; coutage: ageendl; coutaddress: addrendl; Student1( ) priv

50、ate:调用基类构造函数调用基类构造函数派生类新增的数据派生类新增的数据成员初始化成员初始化电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT int age; string addr; ;int main( ) Student1 stud1(10010,Wang-li,f,19,115 Beijing Road,Shanghai); Student1 stud2(10011,Zhang-fun,m,21,213 Shanghai Road,Beijing); stud1.show( ); stud2.show( ); re

51、turn 0;运转结果为运转结果为num: 10010name: Wang-lisex: fage: 19address: 115 Beijing Road,Shanghainum: 10011name: Zhang-funsex: mage: 21address: 213 Shanghai Road,Beijing电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT派生类构造函数的普通方式为派生类构造函数的普通方式为:派生类构造函数名派生类构造函数名(总参数表列总参数表列):基类构造函数名基类构造函数名(参数表列参数表列)

52、派生类中新增数据成员初始化语句派生类中新增数据成员初始化语句例如:例如:电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT派生类构造函数在类外定义,而在类体中函数的声派生类构造函数在类外定义,而在类体中函数的声明明: : Student1(int nStudent1(int n,string namstring nam,char schar s,int aint a,string ad);string ad);在类的外面定义派生类构造函数在类的外面定义派生类构造函数: : Student1Student1(int n,str

53、ing nam,char Student1Student1(int n,string nam,char s,int as,int a,string ad):Student(nstring ad):Student(n,namnam,s)s) age=a; addr=ad; age=a; addr=ad;电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT留意留意: : 在类中对派生类构造函数声明时,不包括基类构造在类中对派生类构造函数声明时,不包括基类构造函数名及其参数表列即函数名及其参数表列即Student(nStudent(

54、n,namnam,s)s)。调用基类构造函数时的实参是从派生类构造函数总调用基类构造函数时的实参是从派生类构造函数总参数表中得到的,也可以不从派生类构造函数总参参数表中得到的,也可以不从派生类构造函数总参数表中传送过来,而直接运用常量或全局变量。数表中传送过来,而直接运用常量或全局变量。例例: : Student1(string namStudent1(string nam,char schar s,int aint a,string string ad)ad):Student(10010Student(10010,namnam,s) age=a; addr=ad;s) age=a; addr

55、=ad;常量常量电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu利用初始化表对构造函数的数据成员初始化利用初始化表对构造函数的数据成员初始化u Student1(int n, string nam,char s,int a, Student1(int n, string nam,char s,int a, string ad):string ad):u Student(n,nam,s),age(a),addr(ad) Student(n,nam,s),age(a),addr(ad)u在建立一个派生类对象时,执行构造函数的

56、顺序是在建立一个派生类对象时,执行构造函数的顺序是: : u派生类构造函数先调用基类构造函数;派生类构造函数先调用基类构造函数;u再执行派生类构造函数本身再执行派生类构造函数本身( (即派生类构造函数的函即派生类构造函数的函数体数体) )。u在派生类对象释放时,执行析构函数的顺序是在派生类对象释放时,执行析构函数的顺序是: : u先执行派生类析构函数;先执行派生类析构函数;u再执行其基类析构函数。再执行其基类析构函数。电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT类的数据成员中还可以包含类对象。类的数据成员中还可以包含类

57、对象。例例: : Student s1; / s1Student s1; / s1是是StudentStudent类的对象类的对象s1s1就是类对象中的内嵌对象,称为子对象就是类对象中的内嵌对象,称为子对象(subobject)(subobject),即对象中的对象。,即对象中的对象。11.5.2 11.5.2 有子对象的派生类的构造函数有子对象的派生类的构造函数电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.6 包含子对象的派生类的构造函数。包含子对象的派生类的构造函数。#include #include us

58、ing namespace std;class Student public: Student(int n, string nam ) num=n; name=nam; void display( ) coutnum:numendlname:nameendl;protected: int num; string name;class Student1: public Student电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT public: Student1(int n, string nam,int n1, stri

59、ng nam1,int a, string ad):Student(n,nam),monitor(n1,nam1) age=a; addr=ad; void show( ) coutThis student is:endl; display(); coutage: ageendl; coutaddress: addrendl; void show_monitor( ) coutendlClass monitor is:endl; monitor.display( ); /调用基类成员函数调用基类成员函数 基类参数基类参数子类参数子类参数派生类参数派生类参数1、基类构造函数、基类构造函数2、子类

60、构造函数、子类构造函数3、派生类构造函数、派生类构造函数电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTprivate: Student monitor; /定义子对象定义子对象(班长班长) int age; string addr; ;int main( )Student1 stud1(10010,Wang-li,10001,Li-sun,19,115 Beijing Road,Shanghai); stud1.show( ); stud1.show_monitor(); /输出子对象的数据输出子对象的数据return 0;运转时的输出如下运转时的输出如下: This student is:num: 10010name: Wang-liage: 19address:115 Beijing Road,Shanghai Class monitor is:num:10001name:Li-sun电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT定义派生类构造函数的普通方式为:定义派生类构造函数的普通方式为:派生类构造

温馨提示

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

评论

0/150

提交评论