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

继承 (上)【C++】

文章目录

  • 继承的定义
  • 继承的语法
  • 继承权限和继承到子类后父类成员的访问限定符的变化
    • 继承到子类后父类成员的访问限定符的变化
  • 子类继承到了父类的什么?
  • 继承中的作用域
  • 子类和父类之间的赋值转换
    • 子类对象可以直接赋值给父类对象,但是父类对象不能直接赋值给子类对象
    • 父类指针可以直接指向 子类 对象,但是子类指针不能直接指向父类对象
    • 父类类型的引用可以直接引用 子类 对象,但是子类引用不能直接引用父类对象

继承的定义

继承(inheritance)机制是面向对象程序设计使代码复用的最重要的手段
它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或者子类)。
继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。

继承的目的是为了代码重用扩展基类的行为,并建立一个类型之间的层次结构。


继承的语法

C++的继承分为单继承和多继承

单继承语法:

class 子类名 :继承权限 父类名
{子类类体
}

多继承语法:

class 子类名: 继承权限 父类名,继承权限 父类名,继承权限 父类名, ......
{子类类体
}

多继承的语法其实就是在单继承后面加上逗号,再进行添加继承的父类


继承权限和继承到子类后父类成员的访问限定符的变化

3个继承权限和类里面的3个访问限定符一样,分为:

  1. 公有继承权限:关键字public
  2. 保护继承权限:关键字protected
  3. 私有继承权限:关键字private

继承到子类后父类成员的访问限定符的变化

继承到子类后父类成员的访问限定符的变化都是固定的语法规定好的所以记住就好
可以表现成如下的表格

类成员/继承方式public继承protected继承private继承
父类中的 public成员变成子类中的public成员变成子类中的protected成员变成子类中的private成员
父类中的 protected成员变成子类中的protected成员变成子类中的protected成员变成子类中的private成员
父类中的 private成员子类不可访问子类不可访问子类不可访问

注意:

  1. 父类中的private限定的成员,不管以什么继承权限继承到子类,子类都访问不了
    因为这是private限定符的特点:除了友元以外,private限定的都只能在类域里面被访问,类外的任何地方都不能访问

  2. 父类中被protected限定符限定的成员,可以在继承该父类的子类以及父类自己的类域里面访问,在其他地方不能访问
    所以protected限定符是专门为继承而设置的

  3. 使用关键字class定义的子类默认的继承方式是private
    使用struct定义的子类则默认的继承方式是public
    不过为了可读性,最好显示的写出继承方式

  4. 虽然继承权限有3个,但是我们实际写代码用继承的时候,基本上都会用public继承权限进行继承


子类继承到了父类的什么?

子类会继承父类的所有成员【包括成员变量和成员函数,父类的private修饰的私有成员也会继承下来,只不过就算继承下来了,子类也访问不了

但是其中又有一些小细节:

  1. 子类继承来的非静态成员变量,子类实例化对象后会把它们存储在自己的对象中。
    但是静态成员变量就不会,而且子类继承到的静态成员变量和父类中的是同一个,同一地址的变量
    因为父类自己的静态成员变量都不存储在对象中,而是存储在全局区,让所有的父类对象访问到的是同一变量
    所以其是子类继承静态成员变量,就相当于是子类的所有对象和父类所有对象一样,拥有了访问存储在全局区的父类的静态成员变量的权利

  2. 因为所有类的成员函数都不存储在对象中,而是和普通函数一样存储在公共的代码段,只不过有类域的限制
    所以子类继承父类的成员函数当然不是拷贝一份下来,而是和父类一样拥有了访问和使用这些函数的权利了。


继承中的作用域

  • 子类和父类的作用域是不同的,独立的,是不同的两个类域
    所以子类才不能在自己的类域中访问父类的private成员,同样的父类也不能在自己的类域中访问子类定义的private成员

  • 如果子类自己又定义了与父类同名的成员包括成员变量和成员函数】,那么子类自己定义的从父类那里继承来的同名的成员就构成隐藏
    隐藏:构成隐藏的成员虽然同名,并且在同一作用域【子类类域】下,但是不会报错,可以共存
    但是子类对象(指针,引用)直接使用这个构成隐藏的成员的时候,只会使用到子类自己定义的那个成员。
    此时如果要使用从父类那里继承来的,就要加上父类的类域进行限制

    在这里插入图片描述
    此时要特别注意:
    因为子类的自己定义的成员函数与从父类那里继承来的成员函数同名,也会构成隐藏。
    也就意味着:此时子类调用直接构成隐藏成员函数的时候,只会找子类自己类域中的同名函数不会去父类里面找,即使父类里面有合适的
    因为有函数重载的存在,此时使用不慎就会出错

    在这里插入图片描述
    因为子类直接调用构成隐藏的成员函数,就只会在子类自己的类域中找,同名就构成隐藏了
    但是因为函数重载的存在,编译器对函数调用的要求更高,要同名同参数表才能调用
    所以因为构成隐藏就只能在子类中找函数进行调用,但是在子类里面又找不到调用的func的重载,那就只能报错了

所以实际的代码编写的时候,尽量不要定义同名的成员


子类和父类之间的赋值转换

子类对象可以直接赋值给父类对象,但是父类对象不能直接赋值给子类对象

子类对象可以直接赋值给父类对象是因为:

  1. 子类会继承父类的所有成员,所以父类里面有的成员,子类里面也一定有

  2. 即使子类自己又新增了成员变量,子类对象赋值给父类对象的时候也只需要“切割”一下就好

在这里插入图片描述
此时,子类B的对象要赋值给父类A的对象,也只需要沿着上图中蓝色的线“切割”一下就好


而父类对象之所以不能直接赋值给子类对象
就是因为如果子类对象新增了成员,那新增的成员父类一定是没有的

如果赋值过去的话,子类自己新增的成员就接收不到赋值
在这里插入图片描述


父类指针可以直接指向 子类 对象,但是子类指针不能直接指向父类对象

父类指针可以直接指向子类对象,是因为:

  1. 父类对象的大小一定是小于等于子类对象的大小的,所以父类指针指向子类对象的时候,解引用父类指针一定不会越界访问
  2. 父类指针指向子类对象的时候,父类指针只能操纵子类从父类那里继承来的成员

    在这里插入图片描述

所以父类指针可以直接指向子类对象,并且是安全的


子类指针不能直接指向父类对象,就是因为:

子类对象的大小一定大于等于父类对象,那么当子类对象的大小大于父类对象时,子类指针指向父类对象的话
解引用一下子类指针,或者访问(修改)一下子类自己新增的成员,都会越界

在这里插入图片描述
所以子类指针直接指父类对象是非常不安全的


父类类型的引用可以直接引用 子类 对象,但是子类引用不能直接引用父类对象

原因和父类指针可以直接指向 子类 对象,但是子类指针不能直接指向父类对象的原因一模一样

  1. 父类对象的大小一定是小于等于子类对象的大小的,所以父类引用引用子类对象的时候,直接使用父类引用一定不会越界访问
  2. 父类引用引用子类对象的时候,父类引用也只能操纵子类从父类那里继承来的成员
  3. 子类对象的大小一定大于等于父类对象,那么当子类对象的大小大于父类对象时,子类引用引用父类对象的话
    访问(修改)一下子类自己新增的成员,就会越界

    在这里插入图片描述

相关文章:

继承 (上)【C++】

文章目录 继承的定义继承的语法继承权限和继承到子类后父类成员的访问限定符的变化继承到子类后父类成员的访问限定符的变化 子类继承到了父类的什么?继承中的作用域子类和父类之间的赋值转换子类对象可以直接赋值给父类对象,但是父类对象不能直接赋值给…...

WPF打印控件内容

当我们想打印控件内容时&#xff0c;如一个Grid中的内容&#xff0c;可以用WPF中PrintDialog类的PrintVisual()方法来实现 界面如下&#xff1a; XAML代码如下 <Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width"300"…...

[C++][opencv]基于opencv实现photoshop算法图像剪切

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像剪切 //参数&#xff1a;src为源图像&#xff0c; dst为结果图像, rect为剪切区域 //返回值&#xff1a;返回0表示成功&#xff0c;否则返回错误代码 int imageCrop(InputArray src, OutputArray dst,…...

四十、大数据技术之Kafka3.x(3)

&#x1f33b;&#x1f33b; 目录 一、Kafka Broker1.1 Kafka Broker工作流程1.1.1 Zookeeper 存储的Kafka信息1.1.2 Kafka Broker 总体工作流程1.1.3 Broker 重要参数 1.2 生产经验——节点服役和退役1.2.1 服役新节点1.2.2 退役旧节点 1.3 Kafka 副本1.3.1 副本基本信息1.3.2…...

redis——基本命令

什么是Reids&#xff08;REmote Dictionary Server&#xff09; Redis是现在主流的数据库之一&#xff0c;是一个使用ANSI C编写的开源、包含多种数据结构、支持网络的、基于内存、可选持久性的键值对存储数据。 特性 1.速度快 &#xff1a;Redis的数据全部存储瑜内存中。 …...

pytorch实现单层线性回归模型

文章目录 简述代码重构要点 数学模型、运行结果数据构建与分批模型封装运行测试 简述 python使用 数值微分法 求梯度&#xff0c;实现单层线性回归-CSDN博客 python使用 计算图&#xff08;forward与backward&#xff09; 求梯度&#xff0c;实现单层线性回归-CSDN博客 数值微分…...

智能小家电能否利用亚马逊VC搭上跨境快车?——WAYLI威利跨境助力商家

智能小家电行业在全球化背景下&#xff0c;正迎来前所未有的发展机遇。亚马逊为品牌商和制造商提供的一站式服务平台&#xff0c;为智能小家电企业提供了搭乘跨境快车、拓展国际市场的绝佳机会。 首先&#xff0c;亚马逊VC平台能够帮助智能小家电企业简化与亚马逊的合作流程&am…...

顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评

Q&#xff1a;顺丰科技2025届校园招聘面向对象是&#xff1f; A&#xff1a;2025届应届毕业生&#xff0c;毕业时间段为2024年10月1日至2025年9月30日&#xff08;不满足以上毕业时间的同学可以关注顺丰科技社会招聘或实习生招聘&#xff09;。 Q&#xff1a;我可以投递几个岗…...

深入理解 Kibana 配置文件:一份详尽的指南

Kibana 是一个强大的数据可视化平台&#xff0c;它允许用户通过 Elasticsearch 轻松地探索和分析数据。Kibana 的配置文件 kibana.yml 是定制和优化 Kibana 行为的关键。在这篇博客中&#xff0c;我们将深入探讨 kibana.yml 文件中的各个配置项&#xff0c;并提供示例说明。 服…...

算法的学习笔记—链表中倒数第 K 个结点(牛客JZ22)

&#x1f600;前言 在编程过程中&#xff0c;链表是一种常见的数据结构&#xff0c;它能够高效地进行插入和删除操作。然而&#xff0c;遍历链表并找到特定节点是一个典型的挑战&#xff0c;尤其是当我们需要找到链表中倒数第 K 个节点时。本文将详细介绍如何使用双指针技术来解…...

聊聊场景及场景测试

在我们进行测试过程中&#xff0c;有一种黑盒测试叫场景测试&#xff0c;我们完全是从用户的角度去理解系统&#xff0c;从而可以挖掘用户的隐含需求。 场景是指用户会使用这个系统来完成预定目标的所有情况的集合。 场景本身也代表了用户的需求&#xff0c;所以我们可以认为…...

Spring Web MVC入门(中)

1. 请求 访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要 是学习如何传递参数到后端以及后端如何接收. 传递参数, 咱们主要是使⽤浏览器和Postman来模拟&#xff1b; 1.1 传递单个参数 接收单个参数&#xff0c;在Spring MV…...

Django后端架构开发:后台管理与会话技术详解

&#x1f31f; Django后端架构开发&#xff1a;后台管理与会话技术详解 &#x1f539; 后台管理&#xff1a;自定义模型类 Django的后台管理系统提供了强大的模型管理功能&#xff0c;你可以通过自定义模型类来控制模型在后台管理界面的显示和操作。自定义模型类通过继承admin…...

挑战Infiniband, 爆改Ethernet(2)

挑战Infiniband, 爆改Ethernet之物理层 前面说过UE为了挑战Infiniband在AI集群和HPC领域的优势地位&#xff0c;计划爆改以太网技术&#xff0c;以适应AI和HPC集群对高性能、可扩展网络的需求。正如UE联盟关于愿景的说明中宣称的&#xff1a;”提供一个完整的架构&#xff0c;通…...

Postman文件上传接口测试

接口介绍 返回示例 测试步骤 1.添加一个新请求&#xff0c;修改请求名&#xff0c;填写URL&#xff0c;选择请求方式 2.将剩下的media参数放在请求body里&#xff0c;选择form-data&#xff0c;选择key右边的类型为file类型&#xff0c;就会出现选择文件的按钮Select Files&a…...

stm32入门学习14-电源控制

有时候我们的程序中有些触发执行条件&#xff0c;有时这些触发频率很少&#xff0c;我们的程序就一直在循环&#xff0c;这样就很浪费电&#xff0c;我们可以通过PWR电源控制来实现低功耗模式&#xff0c;即只有在触发时才执行程序&#xff0c;其余时间可以关闭一些没必要的设备…...

[C++][opencv]基于opencv实现photoshop算法色相和饱和度调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 HSL.hpp #ifndef OPENCV2_PS_HSL_HPP_ #define OPENCV2_PS_HSL_HPP_#include "opencv2/core.hpp" using namespace cv;namespace cv {enum HSL_COLOR {HSL_ALL,HSL_RED,HSL_YELLOW,HSL_GREEN,HS…...

Github 2024-08-16Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-08-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10TypeScript项目1Ruby项目1Apache Dubbo: 高性能的Java开源RPC框架 创建周期:4441 天开发语言:Java协议类型:Apache License 2.0St…...

AI学习记录 - torch 的 matmul和dot的关联,也就是点乘和点积的联系

有用大佬们点点赞 1、两个一维向量点积 &#xff0c;求 词A 与 词A 之间的关联度 2、两个词向量之间求关联度&#xff0c;求 : 词A 与 词A 的关联度 5 词A 与 词B 的关联度 11 词B 与 词A 的关联度 11 词B 与 词B 的关联度 25 刚刚好和矩阵乘法符合&#xff1a; 3、什么是…...

leetcode 885. Spiral Matrix III

题目链接 You start at the cell (rStart, cStart) of an rows x cols grid facing east. The northwest corner is at the first row and column in the grid, and the southeast corner is at the last row and column. You will walk in a clockwise spiral shape to visi…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...