《第十三章类继承.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《第十三章类继承

第十三章 类继承 派生一个类 TableTennisClass class; class RatedPlayer : public TableTennisClass { …… } 上面使用了公有派生。使用公有派生,基类的公有成员成为派生类的公有成员;基类的私有部分也将成为派生类的一部分,但只能够通过基类的公有和保护方法访问。 上述代码完成了那些工作? 派生类对象存储了基类的数据成员。(派生类继承了基类的实现) 派生类对象可以使用基类的公有和保护方法。(派生类继承了基类的接口) 需要在派生类中添加什么呢? 派生类需要自己的构造函数。 派生类根据需要添加额外的数据成员与成员函数。 构造函数:访问权限的考虑 由于派生类不能直接访问基类的私有成员,又由于派生类继承了基类的私有成员,因此若要想在派生类的构造函数中初始化来至基类的私有成员,必须在使用本身的构造函数时,同时调用基类的构造函数。 在创建派生类对象时,程序首先创建基类对象。从概念上说,这意味着基类对象应当在程序进入派生类构造函数之前被创建。C++ 使用成员初始化列表来实现。 例 RatedPlayer::RatedPlayer(unsigned int r, const char * fn, const char * ln, bool ht):TableTennisPlayer(fn, ln , ht) { rating r; } 若在成员初始化类表中不明显的写出基类的构造函数,则会调用基类默认的构造函数。 当派生对象过期时,程序首先调用派生类的析构函数,然后调用基类的析构函数。 派生类和基类之间的特殊关系 派生类和基类之间的特殊关系: 派生类可以使用基类的方法,前提是基类方法不是私有的。 基类指针和引用可以在不经显示类型转换的情况下,转换为派生类对象。 但基类的指针或引用只能够用于调用基类的方法 而又因此 若函数的 形参是基类的指针或引用,则实参可以是基类 或 派生类。 而又由上可得,可将基类初始化为派生类对象。(因为赋值操作符与复制构造函数 的参数,均为基类的引用); 例 若 class RatedPlayer : public class TableTennisPlayer 则可以有 RatedPlayer ola(1840, “Olaf”, “Loaf”, true); TableTennisPlayer ola2(ola); //调用复制构造函数 TableTennisPlayer(const TableTennisPlayer ) 也可以有 RatedPlayer ola(1840, “Olaf”, “Loaf”, true); TableTennisPlayer ola2; ola2 = ola; //调用赋值操作符 TableTennisPlayer operator=(TableTennisPlayer ); 继承——is-a 关系 C++继承有3种方式:公有继承,私有继承和保护继承。 在一些情况下,可以设计包含公有特征的类,然后建立is-a(其实为is-a-kind-of)或has-a 关系。 而公有继承会建立is-a-kind-of 的关系 多态公有继承 多态公有继承的实现有两个方法 在派生类中从新定义基类的方法 使用虚方法 如果方是通过引用或指针而不是对象调用的,它将确定使用那一种方法。若没有使用关键字virtual, 则程序将根据引用类型 或 指针类型 选择方法。若对于virtual方法,则将根据引用或 指针实际指向的对象类型来确定调用哪个方法(对于非virtual方法,此时仍会调用指针或引用类型所对应的方法)。 为析构函数声明为虚拟的,可以确保释放生成对象时,按正确的顺序调用析构函数。 注意,关键字virtual只用于类声明的方法原型中,而不用于类实现文件中。 静态联编和动态联编 问题的引入 程序将函数调用解释为执行特定的函数代码块,被称为函数名联编(binding)。而在C++中,由于重载的缘故,使不能够单纯的通过函数名来确定到底是执行哪个代码块。但编译器会根据函数名及函数参数及是否为const函数这几个函数特征标,来确定到底是用哪个函数。在编译时进行联编称作静态联编(早期联编)。 而又由于虚函数的存在,虚函数的函数特征标完全相同,只会在程序运行阶段,才能知道到底是那个类的对象调用的虚函数,来实现不同的虚函数的调用。这种在运行阶段的函数联编称为动态联编,也叫晚期联编。 这里讨论动态联编的实现机制 C++中 虚函数的动态联编机制,是通过虚函数表(virtual function table , vtabl)来实现的。 在

文档评论(0)

haha85864 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档