《继承与多态(1).ppt》由会员分享,可在线阅读,更多相关《继承与多态(1).ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、专业教程专业教程理论讲解部分理论讲解部分网络游戏开发语言基础C+程序设计第第8章章 继承与多态继承与多态第8章 继承与多态 继承二义性的处理虚基类继承继承 掌握继承的定义与使用 熟悉虚基类的概念及应用8.1 继承8.1.1 继承的含义第8章 继承与多态基类派生类1添加特有成员先找出大部分事物共性的部分,形成基本的类使它具有一些基本的数据成员和一些基本的成员函数,以实现基本的功能。然后根据需要再在这个类的基础上派生出新的类来,这个新类首先一定具有基础类的所有的数据成员和函数成员,也就是具有这个基础类的所有功能,同时它还应有一些自已特有的成员,实现一些区别于基础类的功能。8.1 继承8.1.1 继
2、承的含义第8章 继承与多态在C+中引入继承机制的原因是为了描述由简单到复杂的各个不同层次的事物。使各个类不会因为过于庞大和复杂而显得臃肿和不够灵活,也不会因为过于简单而显的功能不强。8.1 继承8.1.2 派生类的定义第8章 继承与多态派生类说明也是类说明,不过需要指明它所继承的基类,同时在类的成员中可增加一类保护成员。class 类名:基类说明表private:私有成员表protected:保护成员表public:公有成员表;8.1 继承8.1.2 派生类的定义第8章 继承与多态基类说明表:列出所给类的基类派生方式 基类名派生方式有3种:public 表示公有派生,protected 表示保
3、护派生,private 表示私有派生。示例class A;class C:public A;8.1 继承8.1.2 派生类的定义第8章 继承与多态C+语言中继承有两种,单继承和多继承class C:public A单继承多继承class C:public A,public B8.1 继承8.1.3 派生类对基类成员的访问权限第8章 继承与多态基类成员在各自派生类中的存取权限见下表基类成员的访问控制public继承protected继承private继承private不可访问不可访问不可访问protectedprotectedprotectedprivatepublicpublicprotect
4、edprivate8.1 继承8.1.3 派生类对基类成员的访问权限第8章 继承与多态继承与派生关系,应该注意以下5点一个类可以派生出多个派生类一个类可有一个或多个基类派生类又可有派生类,称为多级继承8.1 继承8.1.3 派生类对基类成员的访问权限第8章 继承与多态继承与派生关系,应该注意以下5点继承关系不可循环。基类的友元关系和基类的构造函数和析构函数都不能被派生类所继承。8.1 继承8.1.4 派生类的构造函数和析构函数与基类的关系第8章 继承与多态构造派生类对象时,要对其基类数据成员、新增数据成员进行初始化。派生类的构造函数的一般格式如下。派生类名(参数表):成员初始化表构造函数体成员
5、初始化表如下:基类名1(基类参数表1),基类名n(基类参数表n),对象成员名1(对象成员参数表1),对象成员名m(对象成员参数表m)8.1 继承8.1.4 派生类的构造函数和析构函数与基类的关系第8章 继承与多态创建派生类对象的步骤为:按照继承的顺序,从左至右,调用各基类的构造函数按照在派生类中的声明顺序,调用基类对象的构造函数调用派生类自己的构造函数释放派生类对象的步骤与创建的步骤正好相反:按照继承的顺序,从左至右,调用各基类的析构函数按照在派生类中的声明顺序,调用基类对象的析构函数调用派生类自己的析构函数8.1 继承8.1.4 派生类的构造函数和析构函数与基类的关系第8章 继承与多态1)派
6、生类构造函数的参数不仅要为自己的数据成员提供初始化数据,还要为基类,以及基类的基类提供初始化数据;2)由成员初始化表指明哪些参数用于本类,哪些参数用于基类;3)在多重继承的情况下,构造函数的执行顺序是先基类(多个基类则按基类说明表处的自左至右顺序,而并不按成员初始化表处的顺序),再对象成员,最后是自身。8.1 继承8.1.4 派生类的构造函数和析构函数与基类的关系第8章 继承与多态派生类的对象必然是一个基类对象,通过派生类对象,也就可以直接调用(或存取)其基类的公有或保护成员函数(或公有及保护数据成员)。可以做如下的赋值操作注意,反向的赋值是不允许的派生类对象.基类的公有或保护成员基类对象=派
7、生类对象;8.1 继承8.1.5 继承中容易出现的一些基本问题第8章 继承与多态基类的友元不继承。1)基类的友元不一定是派生类的友元;2)基类的成员是某类的友元,则其作为派生类继承的成员仍是某类的友元。友元与继承8.1 继承8.1.5 继承中容易出现的一些基本问题第8章 继承与多态如果基类中被派生类继承的成员是静态成员,则其静态属性也随静态成员被继承过来。1)这些成员通常用“类名:成员名”方式引用或调用;2)这些成员无论有多少个对象被创建,都只有一个拷贝。静态成员与继承8.1 继承8.1.5 继承中容易出现的一些基本问题第8章 继承与多态派生类对象间的赋值操作依据下面的原则:1)如果派生类有自
8、己的赋值运算符的重载定义,即按该重载函数处理;2)派生类未定义自己的赋值操作,而基类定义了赋值操作,则系统自动定义派生类赋值操作,其中基类成员的赋值按基类的赋值操作进行;派生类对象间的赋值3)二者都未定义专门的赋值操作,系统自动定义缺省赋值操作(按位进行拷贝)。8.1 继承8.1.6 派生关系中的二义性处理1.单一继承时基类与派生类间重名成员的处理第8章 继承与多态单一继承(只有一个基类)时,若基类与派生类的成员重名,则按如下规定进行处理:不加类名限定时默认为是处理派生类成员。要访问基类重名成员时,则要通过类名限定。class Aint a;class B:public Aint a;A aC
9、lass;B bClass示例aClass.a;/派生类成员aClass.B:a;/基类成员8.1 继承8.1.6 派生关系中的二义性处理2.多重继承情况下二基类间重名成员的处理第8章 继承与多态多重继承(具有多个基类)情况下二基类间成员重名时,要按如下方式进行处理:不加类名限定时默认为是处理派生类成员。要访问基类重名成员时,则要通过类名限定。class Aint a;class Bint aclass C:public A,public B示例C cClasscClass.a;/派生类成员cClass.B:a;/基类成员8.1 继承8.1.6 派生关系中的二义性处理3.多级混合继承第8章 继
10、承与多态多级混合继承情况比较复杂,CD以CB1、CB2为基类,CB1、CB2以CA为基类CACB1CB2CD1)CD的对象CDobj 中首先应包含CB1 的对象和CB2 的对象来作为CDobj的组成部分;2)CB1 的对象则首先应以一个CA的对象作为其组成部分;3)CB2 的对象亦首先应以一个CA的对象作为其组成部分。8.1 继承8.1.6 派生关系中的二义性处理3.多级混合继承第8章 继承与多态多级混合继承导致在CD的对象中有两个CA的对象,出现二义性问题。解决这种二义性的方式有两种:CDobj.CB1:a CDobj.CB2:a使用类名限制使用虚基类8.1 继承8.1.7 虚基类的定义及使
11、用1.虚基类的定义及说明第8章 继承与多态虚基类是在出现继承关系时才被定义,只在派生类和基类间有效。说明方式为:在派生类B,C,定义的基类表中,关于基类A 的说明中,增加关键字“virtual”。class A;class B:virtual public A;class C:virtual public A;class D:public B,public C;示例使用虚基类时,类B和类C共享1个类A的拷贝8.1 继承8.1.7 虚基类的定义及使用2.具有显式有参构造函数的虚基类的初始化第8章 继承与多态若虚基类的构造函数具有参数的话,则对其任何一个直接或间接派生类的构造函数来说,它们的成员初
12、始化列表中都必须包含有对该虚基类构造函数的直接调用。在派生类构造函数的成员初始化列表中,若有虚基类构造函数调用的话,则对它们的调用将优先于非虚基类构造函数。8.1 继承8.1.7 虚基类的定义及使用2.具有显式有参构造函数的虚基类的初始化第8章 继承与多态如果虚基类的构造函数没有参数、或者根本就没提供显式的虚基类构造函数的话(表示用该虚基类的无参构造函数或系统默认构造函数来完成有关的初始化工作),对其任何一个直接或间接派生类的构造函数来说,它们的成员初始化列表中都不再需要包含有对该虚基类构造函数的直接调用。虚基类ClaA中的析构函数要定义为虚函数。小结小结第8章 继承与多态本节主要介绍继承和多
13、态的知识:继承二义性的处理虚基类小测验(题目部分)第8章 继承与多态选择题(单选题)选择题(单选题)1、C+中允许多重继承,那么类中允许多重继承,那么类A的父类如果是的父类如果是B和和C,公有继承的语法是(公有继承的语法是()A.A public B;A public C;B.A:public B;A:public C;C.A public B,C;D.A:public B,public C;2、在多继承的构造函数定义中,几个基类的构造函数之间用什么分隔、在多继承的构造函数定义中,几个基类的构造函数之间用什么分隔()()。A.:B.;C.,D.:3、下列对派生类的描述中,哪项是错误的。(、下列
14、对派生类的描述中,哪项是错误的。()A.一个派生类可以作另一个派生类的基类一个派生类可以作另一个派生类的基类B.派生类至少有一个基类派生类至少有一个基类C派生类的成员除了它自己的成员外,还包含了它的基类的成员派生类的成员除了它自己的成员外,还包含了它的基类的成员D派生类中继承的基类成员的访问权限到派生类保持不变派生类中继承的基类成员的访问权限到派生类保持不变 小测验(答案部分)第8章 继承与多态选择题(单项选择题)选择题(单项选择题)1、C+中允许多重继承,那么类中允许多重继承,那么类A的父类如果是的父类如果是B和和C,公有继承的语法是(公有继承的语法是(D)A.A public B;A pu
15、blic C;B.A:public B;A:public C;C.A public B,C;D.A:public B,public C;2、在多继承的构造函数定义中,几个基类的构造函数之间用什么分隔。(、在多继承的构造函数定义中,几个基类的构造函数之间用什么分隔。(C)A.:B.;C.,D.:3、下列对派生类的描述中,哪项是错误的。、下列对派生类的描述中,哪项是错误的。(D)A.一个派生类可以作另一个派生类的基类一个派生类可以作另一个派生类的基类B.派生类至少有一个基类派生类至少有一个基类C派生类的成员除了它自己的成员外,还包含了它的基类的成员派生类的成员除了它自己的成员外,还包含了它的基类的成员D派生类中继承的基类成员的访问权限到派生类保持不变派生类中继承的基类成员的访问权限到派生类保持不变 课后作业第8章 继承与多态【作业作业1】练习类的继承练习类的继承思路分析:实现一个动物类,其包含的方法有运动,捕食,休息等,以思路分析:实现一个动物类,其包含的方法有运动,捕食,休息等,以动物类为基类,派生三个子类,鸟类,鱼类,蛇类,在主程序中按时间动物类为基类,派生三个子类,鸟类,鱼类,蛇类,在主程序中按时间次序描绘三种动物一天的活动。次序描绘三种动物一天的活动。The End第8章 继承与多态