C++语言程序设计:第七章 继承与派生 (2)_第1页
C++语言程序设计:第七章 继承与派生 (2)_第2页
C++语言程序设计:第七章 继承与派生 (2)_第3页
C++语言程序设计:第七章 继承与派生 (2)_第4页
C++语言程序设计:第七章 继承与派生 (2)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、C+语言程序设计浙江工业大学第七章第七章 继承与派生继承与派生C+C+语言程序设计语言程序设计C+语言程序设计浙江工业大学2本讲主要内容本讲主要内容l类的继承类的继承l类成员的访问控制类成员的访问控制l类型兼容规则类型兼容规则l派生类的构造、析构函数派生类的构造、析构函数l派生类成员的标识与访问派生类成员的标识与访问l程序实例程序实例C+语言程序设计浙江工业大学3派生、访问控制和类型兼容派生、访问控制和类型兼容class 派生类名:派生类名:继承方式继承方式 基类名基类名, 成员声明;成员声明;public, private, protected类型兼容规则:一个公有派生类的对象在使用上可以被

2、当作基类的对象上一讲复习C+语言程序设计浙江工业大学4成员的访问控制成员的访问控制总结总结基类基类基类基类自身自身派生类以派生类以公有方式公有方式继承继承派生类以派生类以保护方式保护方式继承继承派生类以派生类以私有方式私有方式继承继承成员成员函数函数对象对象成员成员函数函数对对象象成员成员函数函数对对象象成员成员函数函数对对象象公有公有成员成员xx保护成员保护成员xxxx私有成员私有成员xxxxxxx公有继承:基类的public和protected在派生类中都保持不变;保护继承:基类的public和protected在派生类中都是protected;私有方式:基类的public和protect

3、ed在派生类中都是private类型兼容规则:一个公有派生类的对象在使用上可以被当作基类的对象C+语言程序设计浙江工业大学4.4.派生类的构造、析构函数派生类的构造、析构函数5C+语言程序设计浙江工业大学6类的构造函数类的构造函数派生类的构造、析构函数类名:类名(形参表):初始化列表 函数体初始化概念演示初始化列表演示总结:构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段。构造函数分类演示C+语言程序设计浙江工业大学7派生类的构造函数派生类的构造函数 基类的构造函数不被继承,派生类需基类的构造函数不被继承,派生类需要声明自己的构造函数。要声明自己的构造函数。 声明构

4、造函数时,只需要对本类中新声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类增成员进行初始化,对继承来的基类成员的初始化由基类构造函数完成。成员的初始化由基类构造函数完成。派生类的构造、析构函数派生类名派生类名:派生类名派生类名(基类基类1形参,基类形参,基类2形参,形参,.基类基类n形参,本类形参形参,本类形参):基类名基类名1(参数参数), 基类名基类名2(参数参数), .基基类名类名n(参数参数),对象数据成员的初始化对象数据成员的初始化 本类成员初始化赋值语句;本类成员初始化赋值语句;构造函数演示1构造函数演示2C+语言程序设计浙江工业大学8派生类与基类的构造函数派生类与

5、基类的构造函数 当基类中声明有默认形式的构造函数或未当基类中声明有默认形式的构造函数或未声明构造函数时,派生类构造函数可以不声明构造函数时,派生类构造函数可以不向基类构造函数传递参数。向基类构造函数传递参数。 若基类中未声明构造函数,派生类中也可若基类中未声明构造函数,派生类中也可以不声明,全采用默认形式构造函数。以不声明,全采用默认形式构造函数。 当基类只声明带有形参的构造函数时,派当基类只声明带有形参的构造函数时,派生类也应声明带形参的构造函数,并将参生类也应声明带形参的构造函数,并将参数传递给基类构造函数。数传递给基类构造函数。派生类的构造、析构函数演示C+语言程序设计浙江工业大学9构造

6、函数的调用顺序构造函数的调用顺序1首先首先,在初始化列表中调用基类构造,在初始化列表中调用基类构造函数,执行顺序按照它们被继承时声函数,执行顺序按照它们被继承时声明的顺序(从左向右)。明的顺序(从左向右)。2 其次其次,在初始化列表调用成员对象的,在初始化列表调用成员对象的构造函数,执行顺序按照它们在类中构造函数,执行顺序按照它们在类中声明的顺序。声明的顺序。3 最后最后,执行派生类的构造函数体中的,执行派生类的构造函数体中的内容。内容。派生类的构造、析构函数构造函数调用顺序演示C+语言程序设计浙江工业大学10构造函数构造函数总结总结派生类的构造、析构函数 所有所有基类和成员对象基类和成员对象

7、(只针对类类型,不包只针对类类型,不包含基本数据类型含基本数据类型)都会在初始化阶段初始化,都会在初始化阶段初始化,即使它们没有出现在构造函数的初始化列即使它们没有出现在构造函数的初始化列表中。表中。 基类基类在初始化列表中进行初始化,而在初始化列表中进行初始化,而类的类的成员成员有两种方式,一是使用初始化列表,有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。二是在构造函数体内进行赋值操作。 类类型的成员对象类类型的成员对象在构造函数体内通过赋在构造函数体内通过赋值操作进行状态的设置,这是一种执行效值操作进行状态的设置,这是一种执行效率较低的做法;而率较低的做法;而基本数据类型

8、的成员对基本数据类型的成员对象象却没有这个问题。却没有这个问题。C+语言程序设计浙江工业大学11拷贝构造函数拷贝构造函数 若建立派生类对象时调用默认拷贝构造若建立派生类对象时调用默认拷贝构造函数,则编译器将自动调用基类的默认函数,则编译器将自动调用基类的默认拷贝构造函数。拷贝构造函数。 若编写派生类的拷贝构造函数,则需要若编写派生类的拷贝构造函数,则需要为基类相应的拷贝构造函数传递参数。为基类相应的拷贝构造函数传递参数。派生类的构造、析构函数派生类的拷贝构造函数演示C+语言程序设计浙江工业大学12继承时的析构函数继承时的析构函数 析构函数也不被继承,如果需要析构,析构函数也不被继承,如果需要析

9、构,则要在派生类中自行声明。则要在派生类中自行声明。 声明方法与一般(无继承关系时)类的声明方法与一般(无继承关系时)类的析构函数相同。析构函数相同。 只需负责派生类中只需负责派生类中新增的非对象成员新增的非对象成员的的清理工作即可清理工作即可(例如动态内存的释放例如动态内存的释放) ,不需要显式地调用基类和成员对象的析不需要显式地调用基类和成员对象的析构函数,系统会自动隐式调用。构函数,系统会自动隐式调用。 析构函数的调用次序与构造函数相反。析构函数的调用次序与构造函数相反。派生类的构造、析构函数派生类的析构函数演示C+语言程序设计浙江工业大学5.5.派生派生类成员的标识与访问类成员的标识与

10、访问13C+语言程序设计浙江工业大学14同名隐藏规则同名隐藏规则当派生类与基类中有同名成员时:当派生类与基类中有同名成员时: 若未显式指定类名,则通过派生类对象使用的是派若未显式指定类名,则通过派生类对象使用的是派生类中的同名成员。生类中的同名成员。 如果派生类中声明了与基类成员函数同名的新函数,如果派生类中声明了与基类成员函数同名的新函数,即使函数的参数表不同,从基类继承的同名函数的即使函数的参数表不同,从基类继承的同名函数的所有重载形式也都会被隐藏。所有重载形式也都会被隐藏。 如要通过派生类对象访问基类中被隐藏的同名成员,如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名限定。应使

11、用基类名限定。 使用使用作用域分辨符作用域分辨符”:”,例如,例如 类名类名:成员名成员名 或者或者 类名类名:成员名成员名(参数表参数表)派生类成员的标识与访问C+语言程序设计浙江工业大学15#include using namecpace std;class B1/定义基类定义基类B1 public:/外部接口外部接口int nV;void fun() coutMember of B1endl;class B2/定义基类定义基类B2 public:/外部接口外部接口int nV;void fun()coutMember of B2endl;class D1: public B1, publ

12、ic B2 public:int nV;/同名数据成员同名数据成员void fun()coutMember of D1endl; /同名函数成员同名函数成员;派生类成员的标识与访问C+语言程序设计浙江工业大学16int main() D1 d1;d1.nV=1; /对象名对象名.成员名标识成员名标识, 访问访问D1类成员类成员d1.fun(); d1.B1:nV=2;/作用域分辨符标识作用域分辨符标识, 访问基类访问基类B1成员成员d1.B1:fun();d1.B2:nV=3;/作用域分辨符标识作用域分辨符标识, 访问基类访问基类B2成员成员d1.B2:fun(); return 0;C+语言

13、程序设计浙江工业大学17二义性问题二义性问题 在多继承时,基类之间出现同名成员在多继承时,基类之间出现同名成员时,将出现访问时的二义性(不确定时,将出现访问时的二义性(不确定性)性)用类名限定,或同名隐藏规用类名限定,或同名隐藏规则来解决。则来解决。 当派生类从多个基类派生,而这些基当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义共同基类中的成员时,将产生二义性性采用虚基类来解决。采用虚基类来解决。派生类成员的标识与访问C+语言程序设计浙江工业大学18二义性问题举例(一)二义性问题举例(一)class A publi

14、c: void f();class B public: void f(); void g();class C: public A, piblic B public: void g(); void h();如果声明:如果声明:C c1;则则 c1.f(); 具有二义性具有二义性而而 c1.g(); 无二义性(同名隐藏)无二义性(同名隐藏)派生类成员的标识与访问C+语言程序设计浙江工业大学19二义性的解决方法二义性的解决方法 解决方法一:用类名来限定解决方法一:用类名来限定c1.A:f() 或或 c1.B:f() 解决方法二:同名隐藏解决方法二:同名隐藏在在C 中声明一个同名成员函数中声明一个同名

15、成员函数f(),在,在f()中根据需要调用中根据需要调用 A:f() 或或 B:f()派生类成员的标识与访问C+语言程序设计浙江工业大学20二义性问题举例(二)二义性问题举例(二)class B public: int b;class B1 : public B private: int b1;class B2 : public B private: int b2;class C : public B1,public B2 public: int f(); private: int c;BB1B2CB派生类成员的标识与访问C+语言程序设计浙江工业大学派生类派生类C的对象的存储结构示意图:的对象

16、的存储结构示意图:bb1bb2cB类成员B类成员B1类成员B2类成员C类对象有二义性:有二义性:C c;c.bc.B:b无二义性:无二义性:c.B1:bc.B2:bBB1B2CB演示C+语言程序设计浙江工业大学22虚基类虚基类 虚基类的引入虚基类的引入 用于有共同基类的场合用于有共同基类的场合 声明声明 以以virtual修饰说明基类修饰说明基类例:例:class B1: virtual public B 作用作用 主要用来解决多继承时可能发生的对同一基类继承主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题多次而产生的二义性问题. 为最远的派生类提供惟一的基类成员,而不重复产

17、为最远的派生类提供惟一的基类成员,而不重复产生多次拷贝生多次拷贝 注意:注意: 在第一级继承时就要将共同基类设计为虚基类。在第一级继承时就要将共同基类设计为虚基类。派生类成员的标识与访问C+语言程序设计浙江工业大学23虚基类举例虚基类举例class B private: int b;class B1 : virtual public B private: int b1;class B2 : virtual public B private: int b2;class C : public B1, public B2 private: float c;下面的访问是正确的:下面的访问是正确的:C

18、cobj;cobj.b;派生类成员的标识与访问C+语言程序设计浙江工业大学虚基类的派生类对象存储结构示意图:虚基类的派生类对象存储结构示意图:BB1B2Cb1b2cB1类成员B2类成员C类对象bB类成员24派生类成员的标识与访问C+语言程序设计浙江工业大学25例例7-8虚基类举例虚基类举例D1nV :int nVd:intB1:nV1:intB2:nV2:intfund():voidfun():voidB1nV1 :intB2nV2 :intD1nVd :intfund():void B0nV :intfun()派生类成员的标识与访问C+语言程序设计浙江工业大学B0B1新增成员B0B2新增成员

19、D1新增成员B0B0B1B2D1nV,fun()26派生类派生类D1的对象的存储结构示意图的对象的存储结构示意图演示派生类成员的标识与访问C+语言程序设计浙江工业大学27虚基类及其派生类构造函数虚基类及其派生类构造函数 建立对象时所指定的类称为建立对象时所指定的类称为最(远)派生类最(远)派生类。 虚基类的成员是由最派生类的构造函数通过调虚基类的成员是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。用虚基类的构造函数进行初始化的。 在整个继承结构中,直接或间接继承虚基类的在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的默认构造函数。列出,则表示调用该虚基类的默认构造函数。 在建立对象时,只有最派

温馨提示

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

评论

0/150

提交评论