当前位置: 首页 > 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…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...