热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

C++总复习5C++程序设计继承与多态

C++总复习--5--C++程序设计--继承与多态1.继承思想2.虚函数,多态的思维3.纯虚函

 C++总复习--5--C++程序设计--继承与多态

1.继承思想

2.虚函数,多态的思维


3.纯虚函数和抽象类

4.虚继承


C++ 三大特征:封装   继承    多态

 

继承:继承的本质:代码复用

1.继承和派生的关系

  父类派生出子类   , 子类继承父类

2.   派生类继承了基类什么东西


  1. 普通的成员变量

  2. 普通的成员方法

  3. 静态的成员变量

  4. 静态的成员方法

除了构造和析构函数以外的所有成员

3.派生类的内存布局

    基类的布局优先于派生类

4.派生类的构造函数析构顺序

Derive

  (1)开辟内存

  (2)调用构造函数   

                    先是  基类的构造函数   

                    然后  派生类的构造函数

先构造的后析构

5.继承方式

   访问限定符:

        Public:  任意

        Protected:本类和子类

        Private:   本类

   继承方式:

        Public

        Protected

        Private

基类中不同访问协定符下的成员,以不同的继承方式继承后,在派生类中的访问协定

                                  public        protected          private

        public                 public        protected          不可访问

        protected          protected     protected         不可访问

        private               private        private             不可访问

 

6.类和类的关系

   组合  a part of  has_a

       class 桌腿

       Class 桌子

      {

Private:

    桌腿

}

继承   a kind of  is_a

鸟     燕子

代理    限制底层接口

问:private继承是一个has_a还是一个is_a

      答:has_a

7.同名函数的关系

     (1)重载   overload  又名 重定义

                静多态

     (2)隐藏   overhide

     (3)覆盖   override   又名 重写

                动多态

问:重定义和重写的关系

     答:先说重载是静多态,在编译时确定函数的调用

             覆盖是动多态,在运行时确定函数的调用,动多态就是虚函数的处理,

            在编译阶段,针对虚函数做一个备份,在.rodata(只读数据段)里面生成一个虚函数表存放虚函数的入口地址,数据段加载到内存中,在内存中拿到虚函数的入口地址,针对地址确定函数调用,来实现动多态。

 

多态:默认动多态,用虚函数做支持    关键词 : virtual

1.虚函数的处理机制


  1. 编译阶段

对象和虚函数表

对象里有虚函数指针vfptr,为实现对象和虚函数表的共享关系

2.vfptr和vftable

动多态的调用如下图:

3.虚表的合并和覆盖

继承机制

   虚函数

   基类中同名同参的函数是虚函数

   那么派生类中同名同参的函数也是一个虚函数

派生类中继承的虚函数调用如下图所示:

4.多态

   本质:接口复用

   统一接口  不同形态

 

1.静多态   编译阶段确定函数的调用

      函数重载   模板

2.动多态   运行阶段确定函数的调用  

3.宏多态   预编译阶段确定函数的调用  

 

5.虚函数机制


  1. 虚函数的处理流程

  2. vftable和处理流程

  3. 那些虚函数能成为虚函数



  1. 能取地址

  2. 依赖对象

            (1)普通的类成员方法   

            (2)析构函数

4.虚析构

基类指针 指向派生类对象

解决办法:基类的析构函数设为虚析构

   析构函数满足同名覆盖的关系

     虽然析构函数不同名

vftable

5.过程

基类的虚表调用情况:

虚函数自己生成的未替换的表:

合并表之后:

派生类表中的继承合并后的内存布局

 

6.多态的发生时机

     1.指针调用函数

     2.对象完整

7.虚函数表的写入时机

      构造函数的第一行代码执行之前

8.纯虚函数

1.保留接口

2.不能实现该接口

 

抽象类:比如:平面图形的面积

    不能实例化对象

    只能做指针或者引用来使用

派生类继承抽象类后,一定要实现该类

9.多重继承

     一个派生类是由多个基类继承过来的

  菱形继承

10.虚继承

     vbtable 和 vbptr

11.内存布局***


  1. 非虚基类的布局优先于虚基类

  2. 虚基类的处理和继承顺序有序有关

  3. 虚基类指针合并

 

 


推荐阅读
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 计算机通过镜子测试,科技 _ 你的宠物能通过“镜子测试”吗?“照镜子”揭示了自我意识的发展规律...
    人类并不是唯一能够在镜子中认出自己的生物,但拥有自我意识的物种并不多,只有寥寥可数的几种。自我意识是如何产生的?其作用又是什么࿱ ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了2020年计算机二级MSOffice的选择习题及答案,详细解析了操作系统的五大功能模块,包括处理器管理、作业管理、存储器管理、设备管理和文件管理。同时,还解答了算法的有穷性的含义。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • Linux环境变量$PATH的作用及使用方法
    本文介绍了Linux环境变量$PATH的作用及使用方法。$PATH是一个由多个目录组成的变量,用冒号分隔。当执行一个指令时,系统会按照$PATH定义的目录顺序搜索同名的可执行文件,如果有多个同名指令,则先找到的会被执行。通过设置$PATH变量,可以在任何地方执行指令,无需输入绝对路径。 ... [详细]
  • GTX1070Ti显卡怎么样?GTX1070Ti显卡首发图赏+参数解读与拆解图
    先来简单回顾一下今年的显卡市场,nvidia自从发布了帕斯卡架构新品之后,可以说是一直都主宰着高端游戏显卡市场,虽说amd也憋了一个hbm2的vega64出来,然而即使是最高贵的水 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
author-avatar
西边升起的太阳2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有