第6章类的继承概要.ppt

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

6.3 派生类的构造与析构 其中: (1)基类名1(参数表1), ..., 基类名m(参数表m)为基类成员的初始化表,成员对象名1(成员对象参数表1), ..., 成员对象名n(成员对象参数表n)为成员对象初始化表。派生类中新增的类型为基本类型的数据成员,也可采用成员对象的方式进行初始化。 (2)派生类构造函数中所列出的基类名i(参数表i),在基类中需要有相匹配的构造函数。参数总表中包含其所有基类、成员对象和新增成员初始化所需的参数。 (3)冒号后面的基类名和对象名之间用逗号分隔,其顺序没有严格的限制。 由于基类和派生类都需要调用构造函数来实现初始化成员,这就产生了派生类构造函数和析构函数的执行顺序问题。 在创建派生类对象时,构造函数的调用顺序为: ① 按照在派生类定义时的先后次序调用基类构造函数。 ② 按照在类定义中排列的先后顺序依次调用成员对象的构造函数。 ③ 执行派生类构造函数中的操作。 派生类对象在撤消时是按照构造函数调用相反的次序调用类的析构函数。首先调用派生类析构函数,清除派生类中新增的数据成员;其次调用成员对象析构函数,清除派生类对象中的成员对象;最后调用基类的析构函数,清除从基类继承来的数据成员。 6.3 派生类的构造与析构 【例6-5】设计Teacher类,它继承于Person类并组合了Date类。演示派生类对象在构造和析构时,基类和成员对象构造与析构函数的调用情况。 程序说明: 从程序运行结果可见,虽然在Teacher派生类构造函数定义中成员对象(dateOfWork)声明在基类(Person)前,但依然是基类构造函数先被执行。此外,运行结果显示析构函数的调用次序正好与构造函数调用顺序相反。 派生类构造Teacher(char *n, bool s, int y, int m, int d, int en, char *pt)的总参数表中参数的包括基类构造函数Person(char *n, bool s)和成员对象构造函数Date(int y, int m, int d)的参数。 在派生类构造函数定义中,基类Person的声明格式是Person(n, s),用Date类定义的成员对象dateOfWork的声明格式是dateOfWork(y, m, d)。 6.3 派生类的构造与析构 C++支持从两个及以上基类共同派生出新的派生类,这种继承结构被称为多重继承(Multiple Inheritance)或多继承。多重继承能方便地描述事物的多种特征,能方便地支持代码复用,具有结构简单清晰的优点。 6.4 多重继承与虚基类 6.4 多重继承与虚基类 6.4.1 多重继承 多重继承的派生类继承于多个基类,在派生类定义时,多个基类之间用逗号分隔。派生类对象初始化时,将首先调用基类的构造函数,其调用顺序是参照定义中的次序,如: class C : public A, public B { public: C() : B(), A() { cout Call C Constructor! endl; } }; 基类A的构造函数先调用,尽管在构造函数声明中基类B的构造函数在基类A的前面。 6.4 多重继承与虚基类 由于多重继承的基类不止一个,而不同的类其数据成员和成员函数有可能同名,此时派生类继承了不同基类的同名成员,会出现无法访问的二义性问题。 【例6-6】手机类和MP4播放器类为基类定义音乐手机类,并测试。 6.4 多重继承与虚基类 程序说明: MobilePhone类和MusicPlayer类均拥有show成员函数,在派生类中访问show函数必须的指明是属于哪个基类的成员函数,方法是MobilePhone::show();,其中“::”是作用域标识符。 语句myObj.show();在编译时出错,所报错误为:对“show”的访问不明确。如果将改语句为myObj.MusicPlayer::show();,则能通过编译。 6.4 多重继承与虚基类 6.4.2 虚基类 在例程6-6中,手机类和播放器类均含有商标和价格数据成员,并且在派生类中包含了两份同样的数据。这种设计不仅浪费存储空间,而且会带来数据更新的一致性问题。例如,若音乐手机降价了,则需要同时修改两处price私有数据。一种比较自然的设计方法是定义一个商品类,其中包含商标和价格数据,而手机类和播放器类分别继承于商品类。派生类的层次结构如图所示。 6.4 多重继承与虚基类 在多重继承的类继承层次结构中,继承于两个

文档评论(0)

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

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档