不能在子类的初始化列表中初始化父类的成员

不能在子类的初始化列表中初始化父类的成员

错误示例代码

class A {
protected:int n_;
};class B : public A {
public:B() : n_(0){}
};

编译报错如下:

error: class ‘B’ does not have any field named ‘n_’

前置知识

  • 继承情况下的初始化顺序
    子类对象的构造函数会先复用父类的构造函数创建一个父类对象,然后在父类对象的基础上再创建出自己。
    所以,在子类的构造函数初始化的时候,其父类对象已经构造完成。
  • C++标准要求,每个对象在其生命周期内只能被初始化一次。

编译报错原因解释

  • n_是protect类型,因此,不是访问权限的原因。
  • 根据初始化顺序,子类初始化时会先调用父类的构造函数,然后再调用子类本身的构造函数。
    因此,上面代码中在执行子类的初始化列表进行赋值前,父类的n_已经被初始化了。上面代码试图在子类的构造函数中对父类的成员n_进行第二次初始化,这个是不允许的。

正确示例代码

子类要想在初始化列表中初始化父类的成员变成,正确的做法是调用其父类的构造函数。

class A {
public:A(int n) : n_(n) {};
protected:int n_;
};class B : public A {
public:B() : A(0){}
};

扩展知识

  • 初始化列表的作用
    初始化列表其实是一种后天强加的初始化定义。编译器在编译时,会把初始化列表的内容先转化并插入到构造函数的开头,之后的才执行构造函数里的语句。
    初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数内进行赋值操作。
    使用初始化列表在初始化成员类型为类类型时,能够提供更好的性能。在初始化成员变量时,直接调用拷贝构造函数,而不是调用默认构造函数。
    因此,尽量使用初始化列表。而且,有的情况下只能使用初始化列表:
    • 常量成员。常量只能初始化不能赋值。
    • 引用类型。引用必须在定义的时候初始化,不能重新赋值
    • 没有默认构造函数的类类型。
    • 父类的构造函数有参数时
      另外,成员变量是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的。

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

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

相关文章

FFmpeg: 自实现ijkplayer播放器--08视频解码线程设计

文章目录 视频解码解码流程视频解码线程音频解码线程数据帧队列类型定义数据帧队列api视频解码 视频解码,读取数据包(packet),生成数据帧(frame),放入数据帧队列,用来输出音频和视频 解码流程 stream_component_open: 分配解码器上下文 avcodec_alloc_context3将码…

高频九问:产品经理面试题解析

01 ▼ 需求评审时研发说需求实现不了怎么办? 1.站在技术的角度,了解无法实现的原因 2.看有哪些可以替代的方案 3.评估替代方案对项目本身的影响,如延迟,如若在可接受范围内,适当的妥协 02 ▼ 是否了解我们公司&a…

Flume配置案例@Source:文件,Channel+Sink:Kafka

Source:某个目录下所有文件 Channel:Kafka Sink:Kafka 【Source和Channel的选择】 1)TailDirSource TailDirSource相比ExecSource、SpoolingDirectorySource的优势。 TailDirSource:断点续传、多目录。Flume1.6以前…

大模型微调技术概览解读(chatGLM-6B)

目录 一些比较流行的PEFT方案 Prompt Tuning Prefix Tuning LoRA QLoRA 引用链接 参考文档:通俗解读大模型微调(Fine Tuning) - 知乎 从参数规模的角度,大模型的微调分成两条技术路线: 一条是对全量的参数,进行全量的训练…

【从零开始手搓12306项目】五、如何保证不超卖、不少卖、还能承受极高的并发?

逻辑设计&模型实现 余票查询:记录站站余票 座位购买:记录座位销售详情(将卖票变成01二进制数的计算) 使用事务保证原子性

VMware设置静态ip:以Centos7为例

1、获取网段,子网掩码和网关 到此获取到的信息: 网段:192.168.204.128 ~ 192.168.204.254 子网掩码:255.255.255.0 网关IP:192.168.204.2 2、修改Centos系统的网络配置 使用命令vim /etc/sysconfig/network-scripts/…

Kotlin从0到1,让你一周快速上手!!

声明 大家好,这里是懒羊羊学长,如果需要pdf版以及其他资料,请加入群聊。群里每天更新面经、求职资料,经验分享等,大家感兴趣可以加一下。 Kotlin 声明1.Kotlin基础2. Kotlin函数3.Kotlin进阶4.Kotlin集合5.Kotlin高…

全球顶级的低代码开发平台,你知道几个?

什么是低代码开发平台? 低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。 这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 低码开发工具的好处 低代码平…

【QT教程】QT6数据库操作

QT6数据库操作 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费Q…

为什么公共云的弹性能力很难被发挥出来?

作者|王小瑞 AutoMQ 联合创始人 & CEO 云计算通过资源池化实现单位资源成本更优,使企业能够将 IDC 建设、基础软件研发和运维等工作外包给云厂商,从而更专注于业务创新。资源池不仅包括服务器,还包括人才。云厂商集聚了优秀…

ubuntu20.04.3挂载共享文件夹

VMware设置win共享文件夹 在linux执行挂载命令 sudo vmhgfs-fuse /mnt/hgfs/ -o nonempty这样就可以用管理员访问/mnt/hgfs/share

Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术

Java全套智慧校园系统源码springbootelmentui Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术 智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园…

Docker仅需3步搭建免费私有化的AI搜索引擎-FreeAskInternet

简介 FreeAskInternet 是一个完全免费、私有且本地运行的搜索引擎,并使用 LLM 生成答案,无需 GPU。用户可以提出问题,系统会进行多引擎搜索,并将搜索结果合并到ChatGPT3.5 LLM中,并根据搜索结果生成答案。 什么是 Fr…

3D视觉引导麻袋拆垛破包 | 某大型化工厂

客户需求 此项目为大型化工厂,客户现场每日有大量麻袋拆垛破包需求,麻袋软包由于自身易变形、码放垛型不规则、运输后松散等情况,无法依靠机器人示教位置完成拆垛。客户遂引入3D视觉进行自动化改造。 工作流程: 3D视觉对紧密贴合…

win10系统自带的md5文件校验用法

开始--运行,回车 certutil -hashfile 文件名 md5 其它功能可以看链接:certutil | Microsoft Learn

《剑指 Offer》专项突破版 - 面试题 107 : 矩阵中的距离(C++ 实现)

题目链接:矩阵中的距离 题目: 输入一个由 0、1 组成的矩阵 M,请输出一个大小相同的矩阵 D,矩阵 D 中的每个格子是矩阵 M 中对应格子离最近的 0 的距离。水平或竖直方向相邻的两个格子的距离为 1。假设矩阵 M 中至少有一个 0。 …

JavaScript事件监听测试代码

效果图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>信息填写页面</title><link …

反射【获取class对象、 操作属性、方法】

day38下 反射 前言 使用到一个类&#xff0c;JVM会将该类的class文件加载到方法区&#xff08;类加载机制&#xff09;&#xff0c; 同时会在堆内存中创建该类的class对象&#xff0c;class对象的作为class文件的访问入口 Java的反射机制 ​ JAVA反射机制是在运行状态中&…

在STM32中给固定的地址写入一个值,并通过memory窗口进行查看

首先对STM32中存储数据的地方有一个了解 一个是FLASH,一个是RAM RAM是易失存储器&#xff0c;FLASH是非易失存储器&#xff0c;这是最直观的解释。 主要记住以下几点&#xff1a; RAM&#xff08;随机存储器&#xff09;&#xff1a;既可以从中读取数据&#xff0c;也可以写…

GitHub repository - commits - branches - releases - contributors

GitHub repository - commits - branches - releases - contributors 1. commits2. branches3. releases4. contributorsReferences 1. commits 在这里可以查看当前分支的提交历史。左侧的数字表示提交数。 2. branches 可以查看仓库的分支列表。左侧的数字表示当前拥有的分…