浅析 C++ 继承与派生.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析 C++ 继承与派生 Target: x86_64-linux-gnu gcc version 5.3.1(Ubuntu 5.3.1-14ubuntu2.1 定义 要分析继承,首先当然要知道什么是继承:继承是面向对象程旭设计中 代码可以复用的最 重要的手段,它允许程序员在原有类特性的基础上进行扩展,增加功能。这样产生的新类,就叫 做派生类 (子类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。 继承的格式 class 子类名 :继承权限 基类名 比如下面分别定义了两个类: 如上我们就说类B继承了类A ,类B叫做类A 的派生类或者子类,A类叫做B类的基类或者父类 。 继承关系访问限定符 之前学习类的成员访问限定符的时候都知道public, protected, private 这三种访问限定符的 作用,public修饰的类成员可以在类外被访问,而protected与private则不可以。这三种访问权限 又对应这三种继承关系: 继承关系可以影响子类中继承自父类的成员变量的访问权限,还是在上个栗子的基础上,我 们定义一个B类对象进行如下操作; 编译则会报错: 更多精彩攻略访问 1 会提示pro与pri变量访问权限分别为protected和private,我们不能在类外 用它们。类似的, 在B中定义这样一个成员函数: 会报这样的错: 即基类中的私有成员在子类中是不可见的。关于三种继承方式的成员访问权限总结如下表: 总结: 1. 基类的 private 成员在派生类中是不能被访问的,如果基类成员不想在类外直接被访问, 但需要在派生类中能访问,就定义为 protected 。可以看出保护成员限定符是因继承才出现的。 2. public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用,因为每个子类对象也 都是一个父类对象。 3. protetced/private继承是一个实现继承,基类的部分成员并非完全成为子类 更多精彩攻略访问 2 接口的一部分,是 has-a 的关系原则,所以非特殊情况下不会 用这两种继承关系,在绝大多数的场景 下 用的都是公有继承。 4. 不管是哪种继承方式,在派生类内部都可以访问基类的公有成员和保护 成员,基类的私有成员存在但是在子类中不可见(不能访问。 5. 用关键字class时默认的继承方式 是private, 用struct时默认的继承方式是public,不过最好显示的写出继承方式。 6. 在实际运用中 一般 用都是public继承,极少场景下才会 用protetced/private继承 继承关系中构造/析构函数调用顺序 在现有类的基础上添加如下的构造与析构函数: 然后,在main函数中定义一个类B的对象:B b; 编译运行,看看输出语句的顺序: 先基类构造,后子类构造;析构的时候先析构子类,后析构基类。依旧和以前一样,先构造 的后析构 (因为在栈上)。 让我们走进几行代码的反汇编世界: 这是程序现在运行到了b的定义语句。= 所指,是当前运行的汇编语句。可以看到,第三条 汇编语句调用了B类的构造函数。咦?怎么跟我们刚刚看到的顺序不太一样!不急,先往下看。 直接 ni 运行到第三条汇编,然后用 si 命令跟进去: 可以看到,程序在正式进入B类的构造函数之前,先调用了A类的构造函数,照这么来看,可 以推测出是编译器自动的在B类的构造数的初始化列表位置调用了A类的构造函数。还是让我们把 程序看完: 更多精彩攻略访问 3 果然,又进入了类A 的构造函数。 从A类构造函数出来后,才正式进入类B构造函数。 出main函数作用域时,先调用了B类的构造函数 在B类构造函数的末尾调用了A类构造函数。整个过程与我们看到的输出信息一致

文档评论(0)

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

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

1亿VIP精品文档

相关文档