继承 (上)【C++】

news2024/12/27 13:35:06

文章目录

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

继承的定义

继承(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. 子类对象的大小一定大于等于父类对象,那么当子类对象的大小大于父类对象时,子类引用引用父类对象的话
    访问(修改)一下子类自己新增的成员,就会越界

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring boot 接收第三方mq消息

文章目录 前言一、pom二、配置三、RabbitMQListener总结 前言 mq 用的很少&#xff0c;简单记录一下。 需求&#xff1a;数据提供方采用mq的方式推送数据&#xff0c;我方接收数据后&#xff0c;入库。 一、pom <dependency><groupId>org.springframework.boot&…

基于 Appium 的 App 爬取实战

除了运行 Appium 的基本条件外&#xff0c;还要一个日志输出库 安装&#xff1a; pip install loguru 思路分析 首先我们观察一下整个 app5 的交互流程&#xff0c;其首页分条显示了电影数据&#xff0c; 每个电影条目都包括封面&#xff0c;标题&#xff0c; 类别和评分 4…

Linux下Oracle 11g升级19c实录

1.组件信息 source /home/oracle/.bash_profile11g && sqlplus "/ as sysdba"<<EOF set line 200 col COMP_NAME for a40 select comp_name,VERSION,STATUS from dba_registry; exit; EOF COMP_NAME VERSION …

自动化之响应式Web设计:纯HTML和CSS的实现技巧

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 响应式Web设计是一种使Web页面在各种设备和屏幕尺寸下都能良好显示的设计方法。随着移动设备的普及&#xff0c;响应式设计已经成为Web开发中的标准实践。本文将探讨如何使用纯HTML和CSS实现响应式Web设计&#xff0c;覆…

测试架构师领导力的原则

目录 一、建立信任关系 二、建立共识 三、通过关系带来安全 四、要身体力行&#xff0c;以身作则 五、适当处理风险&#xff0c;什么是鞭炮&#xff0c;什么是原子弹 测试架构师的领导力是建立在把握和执行的某些原则上---信任&#xff0c;认知&#xff0c;安全&#xff0…

Python 算法交易实验81 QTV200日常推进-重新实验SMA/EMA/RSI

说明 本次实验考虑两个点&#xff1a; 1 按照上一篇谈到的业务目标进行反推&#xff0c;有针对性的寻找策略2 worker增加计算的指标&#xff0c;重新计算之前的实验 内容 工具方面&#xff0c;感觉rabbitmq还是太慢了。看了下&#xff0c;rabbitmq主要还是面向可靠和灵活路…

【软件测试】软件系统测试方案(Word原件)

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…

Openstack 与 Ceph集群搭建(上): 规划与准备

文章目录 写在前面网络架构节点规划软件版本避坑指南 基础配置1. host配置2. 修改hostname名称3. 确保root账号能登录系统4. 配置NTP5. 配置免密登录 写在前面 近期将进行三节点的Openstack、Ceph集群混合部署&#xff0c;本人将详细记录该过程。在此之前&#xff0c;本文为Op…

逆向开发LabVIEW程序的操作与注意事项(无源代码)

1. 概述与准备工作 当手头没有源代码&#xff0c;只有LabVIEW编译后的可执行程序时&#xff0c;逆向开发的难度和复杂性大大增加。需要用到的工具、方法和策略也会有所不同。逆向工程的目标是在没有源代码的情况下重建或理解该程序的功能、结构和行为。涉及CameraLink通讯的程…

Android大脑--systemserver进程

用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 本文摘要 系统native进程的文章就先告一段落了&#xff0c;从这篇文章开始写Java层的文章&#xff0c;本文同样延续自述的方式来介绍systemserver进程&#xff0c;通过本文您将…

day34-nginx常用模块

## 0. 网络面试题 网络面试题: TCP三次握手 TCP四次挥手 DNS解析流程 OSI七层模型 抓包工具 tcpdump RAID级别区别 开机启动流程 如何实现不同的网段之间通信(路由器) ip route add 192.168.1.0 255.255.255.0 下一跳的地址或者接口 探测服务器开启了哪些端口(无法登录服务器…

嵌入式开发如何看芯片数据手册

不管什么芯片手册&#xff0c;它再怎么写得天花乱坠&#xff0c;本质也只是芯片的使用说明书而已。而说明书一个最显著的特点就是必须尽可能地使用通俗易懂的语句&#xff0c;向使用者交代清楚该产品的特点、功能以及使用方法。 以TMP423为例&#xff0c;这是一个测量温度的芯…

【密码学】密钥管理:①基本概念和密钥生成

密钥管理是处理密钥从产生到最终销毁的整个过程的有关问题&#xff0c;包括系统的初始化及密钥的产生、存储、备份与恢复、装入、分配、保护、更新、控制、丢失、撤销和销毁等内容。 一、密钥管理技术诞生的背景 随着计算机网络的普及和发展&#xff0c;数据传输和存储的安全问…

蓝牙音视频远程控制协议(AVRCP) command跟response介绍

零.声明 本专栏文章我们会以连载的方式持续更新&#xff0c;本专栏计划更新内容如下&#xff1a; 第一篇:蓝牙综合介绍 &#xff0c;主要介绍蓝牙的一些概念&#xff0c;产生背景&#xff0c;发展轨迹&#xff0c;市面蓝牙介绍&#xff0c;以及蓝牙开发板介绍。 第二篇:Trans…

智慧运维:数据中心可视化管理平台

图扑智慧运维数据中心可视化管理平台&#xff0c;实时监控与数据分析&#xff0c;优化资源分配&#xff0c;提升运维效率&#xff0c;确保数据中心的安全稳定运行。

Linux进程间通信——匿名管道

文章目录 进程间通信管道匿名管道匿名管道使用 进程间通信 进程设计的特点之一就是独立性&#xff0c;要避免其他东西影响自身的数据 但有时候我们需要共享数据或者传递信息&#xff0c;传统的父子进程也只能父进程传递给子进程信息 因此进程间通信还是很必要的&#xff0c;…

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(三):静态障碍物与动态障碍物ST图构建

参考文章: (1)Apollo6.0代码Lattice算法详解——Part4:计算障碍物ST/SL图 (2)自动驾驶规划理论与实践Lattice算法详解 1 计算障碍物ST/SL图 计算障碍物ST/SL图主要函数关系图: // 通过预测得到障碍物list auto ptr_prediction_querier = std::make_shared<Predict…

2024新型数字政府综合解决方案(五)

新型数字政府综合解决方案通过集成人工智能、大数据、区块链和云计算技术&#xff0c;打造了一个智能化、透明化和高效的政务服务平台&#xff0c;旨在提升政府服务的响应速度、处理效率和数据安全性。该方案实现了跨部门的数据共享与实时更新&#xff0c;通过智能化的流程自动…

Waterfox vG6.0.8 官方版下载和安装步骤(一款响应速度非常快的浏览器)

前言 Waterfox 水狐浏览器&#xff0c;从字面上我们可以轻松的了解该款浏览器的一些特点。Waterfox是通过Mozilla官方认证的纯64位版火狐浏览器&#xff0c;而Waterfox 10采用Firefox 10官方源码编译而成&#xff0c;改进了大内存和64位计算的细节&#xff0c;在64位Windows系…

用Python读取Excel数据在PPT中的创建图表

可视化数据已成为提高演示文稿专业度的关键因素之一。使用Python从Excel读取数据并在PowerPoint幻灯片中创建图表不仅能够极大地简化图表创建过程&#xff0c;还能确保数据的准确性和图表的即时性。通过Python这一桥梁&#xff0c;我们可以轻松实现数据自动化处理和图表生成&am…