当前位置: 首页 > news >正文

C++面向对象语法总结(二)

  • 目录
    • 《C++基础语法总结》
    • 《C++面向对象语法总结(一)》

十一、继承

  • 继承,可以让子类拥有父类的多有成员(变量、函数)
  • 如下面的代码:Student是子类(subclass,派生类),Person是父类(superclass,超类)
    在这里插入图片描述
  • 对象的内存布局:父类的成员变量在前,子类的成员变量在后
    在这里插入图片描述
  • 成员访问权限
    • 成员访问权限、继承方式有3种
      • public:公共的,任何地方都可以访问(struct默认)
      • protected:子类内部、当前类内部可以访问
      • private:私有的,又有当前类内部可以访问(class默认)
    • 子类内部访问父类成员的权限,是以下2项种权限最小的那个
      • 成员本身的访问权限
      • 上一级父类的继承方式
    • 开发中用的最多的继承方式是public,这样能保留父类原来的成员访问权限
    • 访问权限不影响对象的内存布局

十二、初始化列表

  • 特点

    • 一种便捷的初始化成员变量的方式,就是在构造函数括号后面用:隔开,初始化成员变量
    • 只能用在构造函数中
    • 初始化顺序只跟成员变量的声明顺序有关,和赋值顺序无关
  • 下面两种写法是等价的

    • 正常在函数中初始化变量
      在这里插入图片描述

    • 用初始化列表初始化变量
      在这里插入图片描述

  • 初始化列表中可以调用函数
    在这里插入图片描述

  • 初始化列表和默认参数配合使用
    在这里插入图片描述

  • 如果函数声明和实现是分离的,

    • 初始化列表只能写在函数的实现中
    • 默认参数只能写在函数的声明中

十三、构造函数的相互调用

  • 子类调用父类的构造函数需要在初始化列表中调用
    在这里插入图片描述
  • 子类的构造函数默认会调用父类的无参构造函数
  • 如果子类的构造函数显式调用了父类的有参构造函数,就不会再去默认调用父类的无参构造函数
  • 如果父类缺少无参构造函数且父类有有参的构造函数,子类的构造函数必须显式调用父类的有参构造函数
  • 继承体系下的构造函数示例
    在这里插入图片描述

十四、构造、析构顺序

父类构造函数 ===》子类构造函数 ===》 子类析构函数 ===》父类析构函数
在这里插入图片描述

十五、多态

  • 父类指针和子类指针
    • 父类指针可以指向子类指针,是安全的,开发中经常用到(继承方式必须是public)
    • 子类指针指向父类指针是不安全的
      在这里插入图片描述
      在这里插入图片描述
  • 默认情况下,编译器智慧根据指针类型调用对应的函数,不存在多态,如果需要有多态特性,父类的函数需要声明为虚函数(virtual修饰的函数)
  • 多态是面向对象非常重要的一个特性
    • 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
    • 在运行中,可以识别出真正的对象类型,调用对应子类中的函数
  • 多态的要素
    • 子类重写父类的成员函数(override)
    • 父类指针指向子类对象
    • 利用父类指针调用重写的成员函数

十六、虚函数

  • C++中的多态通过虚函数(virtual function)来实现
  • 虚函数:被virtual修饰的成员函数
  • 只要在弗雷中声明为虚函数,子类中重写的虚函数也自动变成虚函数(也就是说子类中可以省略virtual关键字)

十七、虚表

  • 虚函数的实现原理是虚表,这个虚表里面存储着最终需要调用的虚函数的地址,这个虚表也叫做虚函数表
    在这里插入图片描述

  • 虚表的地址在对象内存的最前面,在虚表中已经确定了该对象要使用的虚函数的地址

  • 所有的对象(不管是全局区,栈、堆)共用一份虚表,因为虚表中存的是函数地址,函数是代码,在程序运行中只有一份

  • 虚表的内存地址图(x86的32位环境)
    在这里插入图片描述

  • 虚表的汇编分析
    在这里插入图片描述

十八、多态中子类调用父类的成员函数

  • 子类重写了父类的函数,如果需要显式调用父类的函数,需要显式制定父类的类名和函数名
    在这里插入图片描述

十九、虚析构函数

  • 如果存在父类指针指向子类对象的情况,应该将析构函数声明为虚函数(虚析构函数)
  • delete父类指针时,只有将父类析构函数声明为虚析构函数,才会调用子类的析构函数,这样才能保证析构的完整性
    在这里插入图片描述

二十、纯虚函数

  • 纯虚函数:没有函数体且初始化为0的虚函数,用来定义接口规范
    在这里插入图片描述
  • 抽象类(Abstract class)
    • 含有纯虚函数的类,不可以实例化(不可以创建对象)
    • 抽象类也可以包含非纯虚函数、成员变量
    • 如果父类是抽象类,子类没有完全重写纯虚函数,那么子类依然是抽象类

后记
  个人总结,欢迎转载、评论、批评指正

相关文章:

C++面向对象语法总结(二)

目录 《C基础语法总结》《C面向对象语法总结(一)》 十一、继承 继承,可以让子类拥有父类的多有成员(变量、函数)如下面的代码:Student是子类(subclass,派生类),Person是父类&…...

【LeetCode每日一题】2487. 从链表中移除节点(调用栈+递归+翻转链表)

2024-1-3 文章目录 [2487. 从链表中移除节点](https://leetcode.cn/problems/remove-nodes-from-linked-list/)方法一:调用栈方法二:递归方法三:翻转链表 2487. 从链表中移除节点 方法一:调用栈 1.将所有节点按顺序压入栈中 2.从…...

开源协助平台工程灵活应对多云时代的挑战

平台工程通过标准化控制和灵活性保障了开发实践。但是,随着平台工程的兴起,开源战略又该如何融入其中呢? 虽然平台工程没有一刀切的方法,但越来越明显的是,开源软件和技术对平台工程的成功绝对至关重要——这一点我将在…...

Springboot通过profiles切换不同环境使用的配置

文章目录 简介1.通过分隔符隔离2.通过使用不同的配置文件区分3.测试 简介 一个项目从开发到上线一般要经过几个环境, dev测试环境-uat预生产环境-prod生产环境,每个环境的使用的数据库或者配置不同,这时候可以通过下面两种方式区分配置,达到快速切换的效…...

SpringBoot入门到精通-Spring Boot Jasypt Encrypt 演示

这是 spring boot 应用程序,展示了如何使用 Jasypt 加密值。 关于Jasypt Jasypt 为您提供简单的单向(摘要)和双向加密技术。开放 API,可与任何 JCE 提供程序一起使用,而不仅仅是默认的 Java VM 提供程序。Jasypt 可以很容易地与 Bouncy Castle 等知名提供商一起使用。了解…...

整数的阶乘(英语:factorial)是所有小于及等于

整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,0的阶乘为1。即:n!123...n。 实例 #!/usr/bin/python3 # Filename : test.py # author by : www.dida100.com # 通过用户输入数字计算阶乘 # 获…...

音视频通信

文章目录 一、音视频通信流程二、流媒体协议1、RTSP2、RTMP3、HLS4、WebRTC 一、音视频通信流程 音视频通信完整流程有如下几个环节:采集、编码、前后处理、传输、解码、缓冲、渲染等。 每一个细分环节,还有更细分的技术模块。比如,前后处…...

docker 搭建gitlab 恢复和备份

最近一直在折腾gitlab 代码管理系统 采用docker搭建 镜像网址 https://hub.docker.com/ 技术交流 http://idea.coderyj.com/ 1.因为我要恢复的版本是12.0.9的所有我就下载了docker-ce的12.0.9的镜像 1.下载镜像 docker pull gitlab/gitlab-ce:12.0.9-ce.02.安装 docker run …...

尚硅谷2023版Promise教程从入门到实战(讲师:任安萍)

一、前言:为什么会出现Promise? Promise的重要性我认为没有必要多讲,概括起来说就是五个字:必!须!得!掌!握!。 而且还要掌握透彻,在实际的使用中,有非常多…...

【SpringBoot】分组校验和自定义校验

分组检验 参数校验时,我们希望不同的方法参数校验规则不同,这时就需要分组校验。 public class Category {NotNull(groups Update.class)private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称// NotEmpty(groups {Add.class,…...

19、BLIP-2

简介 github 通过利用预训练的视觉模型和语言模型来提升多模态效果和降低训练成本,预训练的视觉模型能够提供高质量的视觉表征,预训练的语言模型则提供了强大的语言生成能力。 实现过程 为了弥合模态差距,提出了一个分两个阶段预训练的 Qu…...

【微服务核心】MyBatis Plus

文章目录 1. 简介2. 入门使用3. 核心功能3.1 CRUD 接口3.1.1 Mapper CRUD 接口3.1.2 Service CRUD 接口 3.2 条件构造器3.3 分页插件3.4 Mybatis-Plus 注解 4. 拓展4.1 逻辑删除4.2 MybatisX快速开发插件 5. 插件5.1 [分页插件](#page)5.2 乐观锁插件 1. 简介 MyBatis Plus&am…...

什么是Alibaba Cloud Linux?完全兼容CentOS,详细介绍

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版,针对阿里云服务器ECS做了大量深度优化,Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS,Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…...

Spark---RDD算子(单值类型Value)

文章目录 1.RDD算子介绍2.转换算子2.1 Value类型2.1.1 map2.1.2 mapPartitions2.1.3 mapPartitionsWithIndex2.1.4 flatMap2.1.5 glom2.1.6 groupBy2.1.7 filter2.1.8 sample2.1.9 distinct2.1.10 coalesce2.1.11 repartition2.1.12 sortBy 1.RDD算子介绍 RDD算子是用于对RDD进…...

数据库中的MVCC--多版本并发控制

一、前言 1、定义:MVCC(Multi-Version Concurrency Control),多版本并发控制,主要为了提高数据库 的并发性能。是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式。用于实现提交读和可重 复读这两种隔离级别。 2…...

wps将姓名处理格式为:姓**

1.打开wps,在要处理数据右侧一个单元格 输入公式:LEFT(A1,1)&"**",然后回车 2.按住ctrl和处理好的数据的右下角小方框,往下拖动即可生成格式为:姓** 格式的数据 3.复制生成的数据,右键选择 “…...

2023年我的编程之旅:技术演进与自我成长的纪录

2023年我的编程之旅:技术演进与自我成长的纪录 转眼间,2023年已经悄然走到了尾声。这一年,对我来说既是挑战也是机遇的一年。我的编程之旅如同坐上了一辆高速前进的列车,从新技术的学习探索到项目实战的沉浸经历,再到…...

好用免费的WAF---如何安装雷池社区版

什么是雷池​ 雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的 WAF,核心检测能力由智能语义分析算法驱动。 Slogan: 不让黑客越雷池半步。 什么是 WAF​ WAF 是 Web Application Firewall 的缩写,也被称为 Web 应用防火墙。 …...

看似 bug 又非 bug 的一个 bug

最近的一个项目中&#xff0c;对于 CSS 的一些属性一些选择符可以大胆使用&#xff0c;然后很意外得撞上一个 iOS 中 Safari 的一个解析问题。 <Component style{{height: "calc(100vh - 46px)"}}>一个组件</Component> 这样的一段代码很简单&#xff…...

mysql常见问题

批量导入SQL 数据库结构 数据时&#xff0c;如果数据是批量插入的话会报错&#xff1a;2006 - MySQL server has gone away。 解决办法&#xff1a;找到你的 mysql 目录下的 my.ini 配置文件&#xff0c;加入以下代码 max_allowed_packet500M wait_timeout288000 interactiv…...

告别手动刷鱼!用Python+ADB+OCR为COC部落冲突写个自动找鱼脚本(附完整源码与避坑指南)

用Python打造COC智能寻鱼系统&#xff1a;从图像识别到防封策略全解析 1. 项目背景与核心思路 在策略游戏领域&#xff0c;资源收集一直是影响玩家体验的关键环节。以《部落冲突》为例&#xff0c;玩家需要花费大量时间搜索合适的对手获取资源&#xff0c;这种重复性操作既耗时…...

19块钱的24MHz逻辑分析仪,真能搞定STM32的I2C/SPI调试吗?我的实测体验

19元24MHz逻辑分析仪实战&#xff1a;STM32通信协议调试全记录 当我在淘宝看到标价19元的8通道24MHz逻辑分析仪时&#xff0c;第一反应是"这玩意儿能用吗&#xff1f;"——毕竟专业设备动辄上千元的价格早已深入人心。但作为一名常年混迹电子论坛的嵌入式爱好者&…...

如何快速掌握跨平台资源下载工具:res-downloader实用指南

如何快速掌握跨平台资源下载工具&#xff1a;res-downloader实用指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader res-dow…...

detectron2 避坑安装手册:从环境配置到编译成功的全流程解析

1. 环境准备&#xff1a;从零搭建detectron2的避雷指南 第一次接触detectron2的朋友可能会被它的安装过程吓到——CUDA版本冲突、源码编译报错、依赖项缺失&#xff0c;随便一个坑都能让你折腾半天。我去年在部署一个工业质检项目时&#xff0c;曾经花了整整三天时间才把环境跑…...

别浪费骁龙8 Gen3!手把手教你用旧手机+Termux搭建GPU加速的Linux开发机(附性能测试)

榨干骁龙8 Gen3性能&#xff1a;用旧手机打造便携Linux开发站的完整指南 手里那台吃灰的骁龙8 Gen3旗舰机&#xff0c;性能其实比多数轻薄本还强——不信&#xff1f;跑个Geekbench看看。去年花大几千买的机器&#xff0c;现在除了刷短视频就是当备用机&#xff0c;实在暴殄天物…...

ESPript 3.0实战指南:从多序列比到出版级可视化

1. ESPript 3.0入门&#xff1a;为什么科研人员离不开它 第一次接触ESPript是在读博期间&#xff0c;当时导师指着文献里一张色彩斑斓的多序列比对图说&#xff1a;"这种专业图表就是用ESPript做的"。作为生物信息学领域的"老牌神器"&#xff0c;ESPript 3…...

三维地理可视化:地形渲染与建筑物模型展示

三维地理可视化&#xff1a;地形渲染与建筑物模型展示 在数字时代&#xff0c;三维地理可视化技术正逐渐成为城市规划、灾害模拟、旅游开发等领域的重要工具。通过高精度地形渲染与建筑物模型展示&#xff0c;人们能够以更直观的方式理解复杂的地理空间信息。无论是虚拟城市漫…...

SEED-VII数据集实战:5步搞定情感脑电图分析(附Python代码)

SEED-VII数据集实战&#xff1a;5步搞定情感脑电图分析&#xff08;附Python代码&#xff09; 第一次接触SEED-VII数据集时&#xff0c;我被它复杂的文件结构和多维度的情感标注搞得晕头转向。作为一个专注情感计算领域三年的研究者&#xff0c;我深知优质数据集对算法开发的重…...

从家庭WiFi到5G语音:手把手拆解VoWiFi(WiFi通话)的三种接入方式与安全机制

从家庭WiFi到5G语音&#xff1a;手把手拆解VoWiFi&#xff08;WiFi通话&#xff09;的三种接入方式与安全机制 走进一家咖啡厅&#xff0c;手机自动连上公共WiFi的瞬间&#xff0c;你是否想过——此刻拨出的电话可能正通过WiFi信号穿越半个城市&#xff0c;最终以运营商级的安…...

NDK toolchains文件夹详解:为什么你的Android项目找不到arm-linux-androideabi工具链?

NDK工具链架构演进解析&#xff1a;从arm-linux-androideabi到现代ABI的迁移指南 当你在Android Studio中看到"No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi"这个错误时&#xff0c;这实际上反映了Android NDK生态…...