继承和派生

  • 在C++中, 代码重用是通过继承机制来实现的

    • 继承, 就是在一个已经存在的类的基础上, 再建议一个新类
    • 从已经有的类派生出新的类, 派生类就继承了基类的特征, 包括成员和方法
  • 继承可以完成下面的功能
    • 在已有类的基础上添加新功能, 如数组类, 可以添加数学计算
    • 给类添加数据成员, 对于字符串类, 可以派生出一个类, 并添加指定成员表示颜色
    • 修改类方法的行为, 对于普通英雄类, 可以派生出拥有更丰富技能的近战英雄类

使用继承

  • 基类定义公共内容, 统一修改

  • 派生类对象存储了基类的数据成员, 即派生类继承了基类的实现

  • 派生类对象可以使用基类的非私有函数, 即派生类继承了基类的接口

  • 派生类需要自己的构造函数

  • 派生类可以根据需要添加额外的数据成员和函数

  • 基类指针可以在不进行显示类型转换的情况下指向派生类对象

    Warrior warrior("诸葛达摩", 100, 10);
    Hero & refHero = warrior;
    Hero * ptrHero = &warrior; refHero.Move(); //基类引用调用函数
    ptrHero->Move(); //基类指针调用函数
  • 可以将派生类对象赋值给基类对象, 程序将使用隐式重载赋值运算符

    //基类引用指向的也是派生类对象
    Hero hero = warrior;
    hero.Move();
  • 基类指针或引用只能调用基类函数, 并不能调用派生类函数

  • 不可以将基类对象和地址赋给派生类引用和对象, 即不能做逆操作

  • 初始化对象时, 先调用基类的构造函数, 再调用派生类的构造函数; 释放对象时, 先调用派生类的析构函数, 再调用基类的析构函数

单继承

没有继承关系的内存模型

  • 没有继承时, 成员变量和成员函数会分开存储, 对象的内存只包含成员变量, 存储在栈区或堆区; 成员函数与对象内存分离, 存储在代码区
  • 编译器会分别为每个对象的成员变量分配内存, 但是所有对象都共享同一段函数代码
  • 类可以看做是一种复杂的数据类型, 使用sizeof求类所占用的空间大小, 只计算成员变量的大小, 不包含成员函数

有继承关系的内存模型

  • 有继承关系时, 派生类的内存模型可以看成是基类成员变量和新增成员变量的总和
  • 所有成员函数仍然存储在另外一个区域, 即代码区, 由所有对象共享

派生类成员的访问控制

公有继承

  • 基类的公有成员和受保护成员, 在派生类中保持原来的访问属性, 其私有成员仍为基类所独有

私有继承

  • 基类的公有成员和受保护成员, 在派生类中成为了私有成员, 基类的私有成员仍为基类所独有

受保护继承

  • 基类公有成员和受保护成员, 在派生类中成为了受保护成员, 私有成员仍为基类独有

  • 公有权限下, 自己和派生类以及外部都可以访问
  • 私有权限下, 只能自己访问, 派生类以及外部都无法访问
  • 受保护权限下, 自己, 友元, 派生类可以访问, 外部无法访问

继承与组合

  • 在一个类中有另外一个类的成员作为数据成员, 这种方式叫做类的组合形式

  • 通过继承建立的派生类和基类, 是一种is-a "是"的关系, 比如 狗是动物.

  • 类的组合关系, 它们之间不是"是"的关系, 而是"有"的关系, 比如 学生有书包.

  • 继承是纵向的, 而组合是横向的

  • 继承时C与C++的最重要区别之一

    • C++源于C, C++最重要的特性就是引入了面向对象
    • C++中通常也可以直接使用C语言的习惯进行编程
  • 类的继承和组合是面向对象编程的核心

C++---继承和派生的更多相关文章

  1. c++学习--继承与派生

    继承和派生 1 含有对象成员(子对象)的派生类的构造函数,定义派生类对象成员时,构造函数的执行顺序如下: 1 调用基类的构造函数,对基类数据成员初始化: 2 调用对象成员的构造函数,对对象成员的数据成 ...

  2. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  3. [C++]类的继承与派生

    继承性是面向对象程序设计的第二大特性,它允许在既有类的基础上创建新类,新类可以继承既有类的数据成员和成员函数,可以添加自己特有的数据成员和成员函数,还可以对既有类中的成员函数重新定义.利用类的继承和派 ...

  4. O-c中类的继承与派生的概念

    什么是继承 众所周知,面向对象的编程语言具有: 抽象性, 封装性, 继承性, 以及多态性 的特征. 那么什么是继承呢? 传统意义上是指从父辈那里获得父辈留下的东西 在开发中, 继承就是"复用 ...

  5. 程序设计实习MOOC / 继承和派生——编程作业 第五周程序填空题1

    描述 写一个MyString 类,使得下面程序的输出结果是: 1. abcd-efgh-abcd- 2. abcd- 3. 4. abcd-efgh- 5. efgh- 6. c 7. abcd- 8 ...

  6. 走进C++程序世界------继承和派生

    继承和派生 继承是面向对象编程语言的最重要方面之一,正确的使用继承可编写出设计良好,容易于维护和扩展的应用程序.下面是在其他博客中的总结: ****************************** ...

  7. C++学习之路—继承与派生(一):基本概念与基类成员的访问属性

    (本文根据<c++程序设计>(谭浩强)总结而成,整理者:华科小涛@http://www.cnblogs.com/hust-ghtao,转载请注明) 1   基本思想与概念 在传统的程序设计 ...

  8. C/C++基础知识总结——继承与派生

    1. 类的继承与派生 1.1 派生类的定义 (1) 定义规范 class 派生类名: 继承方式 基类1名, 继承方式 基类2名... { ...派生类成员声明; }; (2) 从以上形式上看可以多继承 ...

  9. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  10. 【C++ 实验六 继承与派生】

    实验内容 1. 某计算机硬件系统,为了实现特定的功能,在某个子模块设计了 ABC 三款芯片用于 数字计算.各个芯片的计算功能如下: A 芯片:计算两位整数的加法(m+n).计算两位整数的减法(m-n) ...

随机推荐

  1. thinkpad笔记本选型

    ThinkPad分为了几大系列,低端的有L系列.E系列,比较高端的有T系列.X系列及P系列,这些系列中质量比较稳定属于商务办公系列,中端有针对商务或者是娱乐的R系列.A系列和S系列.具体介绍如下: 1 ...

  2. IDEA快捷键使用分享

    Ctrl+D:复制当前行 Shift+Enter:光标移动到下一行 Alt+/:补全代码 Alt+Enter:万能解错/生成返回值变量 Ctrl+Z:撤销 Ctrl+y:反撤销 Ctrl+y:删除 C ...

  3. ArcGIS对进行数据拓扑修改

    空间数据处理--题目1 土地利用数据每年都在发生变化,故每年都要根据去年的数据进行修改.请根据以下要求,修改A区域的数据并对B区域已做好的数据进行拓扑检查. 一. 数据说明(见"题目1&qu ...

  4. Flink消费kafka

    Flink消费Kafka https://blog.csdn.net/boling_cavalry/article/details/85549434 https://www.cnblogs.com/s ...

  5. Python selenium 三种等待方式解读

    1. 强制等待第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间.看代码: # -*- coding: ...

  6. Microsoft .NET Framework 远程执行代码漏洞

    受影响系统:Microsoft .NET Framework 4.8Microsoft .NET Framework 4.7.2Microsoft .NET Framework 4.7.1Micros ...

  7. Intellij IDEA远程debug线上项目记录

    远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用. JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过 ...

  8. Java8 HashMap扩容时为什么不需要重新hash

    技巧: 与&操作   和   与 n 如8 与,为0  则位置不变 https://blog.csdn.net/zlp1992/article/details/104376309 java8在 ...

  9. Redis的安装与启动(一)

    Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到linux系统.--源码 ...

  10. 什么是 Aspect?

    aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包 括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横 切逻辑编织到 ...