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