第7章 派生与继承.ppt

  1. 1、本文档共41页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 派生与继承

7.1 类的继承与派生 7.1.1 派生和继承概述 7.1.2 派生类的定义 7.1.3 派生类生成过程 7.2 访问控制 7.2.1 公有继承 7.2.2 私有继承 7.2.3 保护继承 7.2.4 基类的静态成员(书上没有) 7.2.5 访问声明(书上没有) 7.3 类型兼容规则 7.4 派生类的构造函数和析构函数 7.4.1 派生类的构造函数 7.4.2 派生类的拷贝构造函数 7.4.3 派生类的析构函数 7.5 多重继承下的二义性 7.5.1 多重继承下的二义性 7.5.2 虚基类 7.5.3 虚基类及其派生类的构造函数 本章小结 作业 对于二义性问题的解决,可以有二种选择: 第一,利用作用域运算符“::”指明要调用的成员函数所属的类范围, 这就是作用域分辨。 第二,在派生类中重新定义一个同名成员,使得该成员可隐藏基类中同名称的成员。 例如,上面派生类D1的fun()函数可定义如下: void D1:: fun() { B1::fun(); //指定调用类B1的fun函数 B2::fun(); //指定调用类B2的fun函数 } 见修改后的例7-6。 在C++中,一个类不能被多次说明为一个派生类的直接基类,但在一个多层次的多重继承体系中可以多次成为一个派生类的间接基类。这样就会造成一个类在一个派生类中有多个拷贝。 例如,我们定义了一个类B0,类B1和类B2都从类B0公有派生,而类D1是从类B1和类B2多重继承的,因此在类D1中就间接地有了类B0的两份拷贝。 2. 访问共同基类的成员时出现二义性 见例7-7 (p244)。 为了解决上述成员模棱两可的问题,C++引人了虚基类的概念。虚基类是一个基类虽被多次的继承,但是各派生类却共用该基类的一份拷贝,这非常像类中的静态成员。 要定义某一基类为虚基类,只须在派生类定义时,在各派生类名和“:”后加关键字virtual即可。例如,我们把上例中的类B1和类B2的定义改为: class B1: virtual public B0{}; class B2: virtual public B0{}; 那么再运行该程序(见修改后的例7-7), 就没有错误。 把一个基类定义为虚基类后,所要考虑的主要问题是虚基类及其派生类的构造函数。如果虚基类有带参数的构造函数, 并且没有声明默认形参值, 那么事情就比较麻烦了。这时, 在整个继承关系中, 所有直接或间接继承虚基类的派生类都必须有构造函数,并在成员初始化表中列出对虚基类成员的初始化。 例如,我们在例7-7中给虚基类B0增加一个有参数的构造函数,则派生类B1、B2和D1都要有一个构造函数。详见程序。 虚基类及其派生类对象的初始化: 建立对象时所指定的类称为最远派生类。 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。 在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的缺省构造函数。 在建立对象时,只有最远派生类的构造函数调用虚基类的构造函数,该派生类的其它基类对虚基类构造函数的调用被忽略。 虚基类及其派生类的另一个问题是初始化顺序问题。虚基类及其派生类的构造函数的调用次序有点差别,调用次序是这样规定的: ①虚基类的构造函数在非虚基类之前调用; ②若同一层次中包含多个虚基类,虚基类构造函数按它们说明的次序调用; ③若虚基类由非虚基类派生,则遵守先调用基类构造函数,再调用派生类构造函数的规则。 详见修改后的例7-7程序。 * * 派生和继承是一个非常自然的属性,人类社会和动植物界都具有典型的派生和继承特性,人们对事物的分类描述也是如此。见图7.1。 在派生和继承体系或分类描述体系中,整个体系具有金字塔结构,最高层是最普遍、最一般的,每一层都比它的上一层更具体,低层含有高层的特性,同时又与高层有细微的差别。 因此,在C++的类定义中,应该遵循这种规律:更高层的类具有更普遍的特征,更低层的类具有更具体的特征。 新的软件总是在原先开发的基础上进行扩充。对于传统的程序员而言,唯一的方法便是改写或重写这些早先定义好的代码。这样的程序设计方法使得所设计出来的程序无法重复使用,是传统程序设

文档评论(0)

xiaolan118 + 关注
实名认证
内容提供者

你好,我好,大家好!

版权声明书
用户编号:7140162041000002

1亿VIP精品文档

相关文档