第五周:继承

继承和派生的基本概念

继承:在定义一个新的类B时,如果该类与某个个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称子类)。
派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。
派生类一经定义后,可以独立使用,不依赖于基类。
派生类拥有基类的全部成员函数和成员变量,不论是private、prtected、public。
注意:在派生类的各个成员函数中,不能访问基类中的private成员。

派生类的写法

class 派生类名: public 基类名 { };
关于继承派生形式可以为private和protected,详见:C++ private和protected派生(私有和保护派生)

派生类对象的体积

等于基类对象的体积,再加上派生类对象自己的成员变量的体积。在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。

继承关系和复合关系

继承:“是”的关系。
基类A,B是基类A的派生类。
逻辑上要求:“一个B对象也是一个A对象”。
复合:“有”关系。
类C中“有”成员变量k,k是类D的对象,则C和D是复合关系
一般逻辑上要求:“D对象是C对象的固有属性或组成部分”。

覆盖和保护成员

覆盖

派生类可以定义一个和基类成员同名的成员,这叫覆盖。在派生类中访问这类成员时,缺省的情况是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符号::。
(注意尽量不要再派生类定义同名的成员变量)

类的保护成员

基类的private成员:可以被下列函数访问
1.基类的成员函数
2.基类的友员函数
基类的public成员:可以被下列函数访问
1.基类的成员函数
2.基类的友员函数
3.派生类的成员函数
4.派生类的友员函数
5.其他的函数
基类的protected成员:可以被下列函数访问
1.基类的成员函数
2.基类的友员函数
3.派生类的成员函数可以访问当前对象的基类的保护成员

派生类的构造函数

在创建派生类的对象时,需要调用基类的构造函数:初始化派生类对象中从基类继承的成员。在执行一个派生类的构造函数之前,总是先执行基类的构造函数。
派生类的析构函数被执行时,执行完派生类的析构函数后,自动调用基类的析构函数。

封闭派生类对象的构造函数执行顺序

在创建派生类的对象时
1.先执行基类的构造函数,用以初始化派生类对象从基类继承的成员;
2.再执行成员对象类的构造函数,用以初始化派生类对象中成员对象。
消亡时析构与构造函数相反。

public继承的复制兼容规则

1.派生类的对象可以赋值给基类对象(保留派生类中的基类内容)
2.派生类对象可以初始化基类引用
3.派生类对象的地址可以赋给基类指针(这点很重要,可以用此来实现多态)
如果派生方式是private或者protected,则上述三条不可行。

直接基类和间接基类

类A派生类B,类B派生类C,类C派生类D,。。。
类A是类B的直接基类
类B是类C的直接基类,类A是类C的间接基类
类C是类D的直接基类,类A、B是类D的间接基类
在声明派生类时,只需要列出它的直接基类
派生类沿着类的层次自动向上继承它的间接基类
派生类的成员包括
1.派生类自己定义的成员。
2.直接基类中的所有成员。
3.所有间接基类的全部成员。

MOOC C++笔记(五):继承的更多相关文章

  1. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  2. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  3. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Django开发笔记五

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...

  5. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  6. 《MFC游戏开发》笔记五 定时器和简单动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...

  7. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  8. Crazyflie笔记五: CRTP 实时通信协议(一)(转)

    源:Crazyflie笔记五: CRTP 实时通信协议(一) 这里详细介绍了 Crazyflie 的 CRTP实时通信协议的相关内容,由于内容很长,分几篇博文来讲述.这里是第一节内容.欢迎交流:301 ...

  9. c++学习笔记之继承篇

    title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...

  10. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. 40 篇原创干货,带你进入 Spring Boot 殿堂!

    两个月前,松哥总结过一次已经完成的 Spring Boot 教程,当时感受到了小伙伴们巨大的热情. 两个月过去了,松哥的 Spring Boot 教程又更新了不少,为了方便小伙伴们查找,这里再给大家做 ...

  2. Okhttp3源码解析(1)-OkHttpClient分析

    ### 前言 上篇文章我们讲了[Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f),今天根据上节讲到请求流程来分析源码,那么第一步就是实例化OkH ...

  3. SpringBoot打包部署简单说明

    SpringBoot项目打包部署 一.jar包方式 这种使用SpringBoot内嵌的Tomcat进行部署 打包方式默认jar,所以下面加也行,不加也行 <packaging>war< ...

  4. three.js基础前置知识

    这一节是纯理论知识,用于介绍three.js的入门概念,也就是开发前需要准备的理论基础. 一,三剑客 当然就是scene,camera,renderer这三个基本要素. scene是一个用于容纳三维空 ...

  5. OpenXML性能真的低下吗?

    博文NET导出Excel的四种方法及评测 中对比了4个库的导出性能,但对OpenXML的评价并不高,本人觉得不合理,所以我重新测试下性能 基于OpenXML的包装类 ExcelDownWorker p ...

  6. yield 实现range()函数

    def range(*args,step= 1): args = list(args) if len(args) == 2: yield args[0] while args[0]<args[1 ...

  7. ubuntu中rc.local不执行问题

    解决思路概括起来如下: 1.首先排除脚本自身问题,可以手动点杠执行下试试, 2.脚本确定没问题后,放到开机启动程序引用的路径下,办法如下 2.1.查看系统的运行级别 2.2.到对应运行的rcX.d的目 ...

  8. bzoj 2726 任务安排 斜率优化DP

    这个题目中 斜率优化DP相当于存在一个 y = kx + z 然后给定 n 个对点 (x,y)  然后给你一个k, 要求你维护出这个z最小是多少. 那么对于给定的点来说 我们可以维护出一个下凸壳,因为 ...

  9. 通过CMD命令窗口获取django版本号

    通过CMD命令窗口获取django版本号 方法一: C:\Users\Administrator>python >>> import django >>> d ...

  10. CSS3 03. 3D变换、坐标系、透视perspective、transformZ、transform-style添加3D效果、backface-visibility元素背面可见、动画animation、@keyfarmes、多列布局

    1.左手坐标系 伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方.这样我们就建立了一个左手坐标系,拇指.食指和中指分别代表X.Y.Z轴的正方向.如下图 CSS中的3D坐标系 CSS ...