C++:派生类的生成过程(构造、析构)
目录
派生类的生成过程
派生类的构造函数与析构函数:
构造函数:
派生类+组合类的构造和析构:
构造函数和析构函数调用顺序:
派生类的生成过程
三步骤:
吸收基类(父类)成员:实现代码重用;
派生类继承了基类除了构造函数、析构函数以外的所有成员函数。
改造基类(父类)成员:改变原基类成员的访问控制权限、同名覆盖原基类的成员;
同名覆盖:在派生类中定义一个与基类同名的成员,派生类的成员将基类原成员隐藏;
对原基类被覆盖成员的访问方式:
//访问被覆盖的A类成员:A::show();新增派生类(子类)成员:对源代码进行扩充。
以派生类的实际需求新增加数据成员和成员函数,以增强派生类的功能
派生类的构造函数与析构函数:
因为派生类无法继承基类的构造函数与析构函数,且派生类成员由继承的基类成员、派生类新增成员共同构成,我们需自行完成构造函数实现对继承成员及新增成员的初始化、析构函数释放成员。
构造函数:
我们可以通过基类构造函数,初始化继承的基类成员
构造函数格式:
派生类名:: 派生类名( 参数列表 ):基类名(初始化列表),新成员(参数)
{};
eg:
//继承与派生的生成过程
#include <iostream>
#include <string>
using namespace std; class A //基类
{
public:A(int i) :a(i) { cout << "A 的构造函数" << endl; };A() :a() { cout << "A 的默认!构造函数" << endl; };~A() { cout << "A 的析构函数" << endl; };void show(){cout << "a=" << a<<endl;}
private:int a;
};class B :public A
{
public:B(int j) :b(j) { cout << "B 的构造函数" << endl; }//等同与://B(int j):A(),b(j)//{cout << "A 的构造函数" << endl; }B(int i, int j) :A(i), b(j) { cout << "B 的构造函数" << endl; }//同名覆盖:void show(){//访问基类原被覆盖成员:A::show();cout << "b=" << b << endl;}~ B() { cout << "B 的析构函数" << endl; }
private :int b;//新增加成员
};
int main()
{A a{9};a.show();B b{7,8};b.show();return 0;
}
注意:
- 基类的构造函数必须在初始化列表内完成:
- 进入构造函数大括号内说明构造函数的功能已经实现,而基类未初始化
- 基类如有默认构造函数时,可以省略不写
- 该构造函数初始化,自动跳转默认构造函数
输出:

总结:派生类的构造:先调用基类构造函数、再调用派生类的构造函数,析构函数则与派生顺序相反(形成对称)
析构函数:
~类名();无差别,特殊情况区别处理;
派生类+组合类的构造和析构:
派生类:继承所得类
组合类:新增加的成员对象是另一个类的对象
//继承与派生的生成过程
//这是配置好的模板文件
#include <iostream>
#include <string>
using namespace std; class X
{
public:X(int x) :c(x){cout << "X(int x)构造函数" << endl;}~X(){cout << "~X()析构函数" << endl;}void show(){cout << "c=" << c << endl;}
private:int c;
};
class A //基类
{
public:A(int i) :a(i) { cout << "A 的构造函数" << endl; };A() :a() { cout << "A 的默认!构造函数" << endl; };~A() { cout << "A 的析构函数" << endl; };void show(){cout << "a=" << a<<endl;}
private:int a;
};
派生类:
class B :public A
{
public:B(int i, int x) : b(i), c(x){cout << "B 的构造函数" << endl;}//等同与://B(int j,int x):A(),b(j),c(x)//{cout << "A 的构造函数" << endl; }B(int i,int j,int x):A(i),b(j),c(x){ cout << "B 的构造函数" << endl; }//同名覆盖:void show(){//访问基类原被覆盖成员:A::show();cout << "b=" << b << endl;c.show();}~ B() { cout << "B 的析构函数" << endl; }
private :int b;//新增加成员X c; //新增组合类的成员
};
int main()
{/*A a{9};a.show();*/B b{7,8,9};b.show();return 0;
}
输出:

构造函数和析构函数调用顺序:
派生类构造函数执行顺序一般是:
基类(父类)、组合类、派生类
具体如下:
(1)先调用基类的构造函数;
(2)然后按照数据成员的声明顺序,依次调用数据成员的构造函数或初始化数据成员;
(3)最后执行派生类构造函数的函数体。
注意:构造函数的执行顺序只与成员声明的顺序有关,而与初始化表中各项的排列顺序无关。
注意:派生类析构函数执行时将自动调用基类、组合类成员对象的析构函数
析构函数执行顺序:
派生类、组合类、基类
析构函数与构造函数顺序相反,形成对称
相关文章:
C++:派生类的生成过程(构造、析构)
目录 派生类的生成过程 派生类的构造函数与析构函数: 构造函数: 派生类组合类的构造和析构: 构造函数和析构函数调用顺序: 派生类的生成过程 三步骤: 吸收基类(父类)成员:实现代…...
金蝶字段添加过滤条件
金蝶字段加过滤条件 F_PLDE_Date<GetValue(FDate) and F_PLDE_Date1>GetValue(FDate)...
SQLite 知识整理
写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 目录 SQLite 类型数据…...
0基础JAVA期末复习最终版
啊啊啊啊啊啊啊啊啊啊,根据网上各位大佬的复习资料,看了很多大多讲的是基础但对内容的整体把握上缺乏系统了解。但是很不幸最终挂科了,那个出题套路属实把我整神了,所以我决定痛改前非,酣畅淋漓的写下这篇文章。。。。…...
【办公类-16-07-04】合并版“2023下学期 中班户外游戏(有场地和无场地版,一周一次)”(python 排班表系列)
背景需求: 把 无场地版(贴周计划用) 和 有场地版(贴教室墙壁上用) 组合在一起,一个代码生成两套。 【办公类-16-07-02】“2023下学期 周计划-户外游戏 每班1周五天相同场地,6周一次循环”&…...
chat GPT第一讲
计算机的语言奇迹:探秘ChatGPT的智能回答和写作能力 目前我们这个行业,最火的话题无疑是AI人工智能,类似ChatGPT这样的智能Ai,今天剩下的时间不多,每天一个主题,我给大家讲一下计算机回答问题和写作的能力,…...
JAVA工程师面试专题-Mysql篇
一、基础 1、mysql可以使用多少列创建索引? 16 2、mysql常用的存储引擎有哪些 存储引擎Storage engine:MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。常用的存储引擎有以下: Innodb引擎:In…...
vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法
文章目录 1、原因2、思路3、解决方法3.1、使用alignTicks解决3.2、结合min和max属性去配置interval属性1、首先固定两边的分隔的段数。2、结合min和max属性去配置interval。 1、原因 刻度在显示时,分割段数不一样,导致左右的刻度线不一致,不…...
编程笔记 Golang基础 022 数组
编程笔记 Golang基础 022 数组 一、数组定义和初始化二、访问数组元素三、遍历数组四、数组作为参数六、特点七、注意事项 在Go语言中,数组是一种基本的数据结构,用于存储相同类型且长度固定的元素序列。 一、数组定义和初始化 // 声明并初始化一个整数…...
【kubernetes】二进制部署k8s集群之,多master节点负载均衡以及高可用(下)
↑↑↑↑接上一篇继续部署↑↑↑↑ 之前已经完成了单master节点的部署,现在需要完成多master节点以及实现k8s集群的高可用 一、完成master02节点的初始化操作 二、在master01节点基础上,完成master02节点部署 步骤一:准备好master节点所需…...
哈希表在Java中的使用和面试常见问题
当谈到哈希表在Java中的使用和面试常见问题时,以下是一些重要的点和常见问题: 哈希表在Java中的使用 HashMap 和 HashTable 的区别: HashMap 和 HashTable 都实现了 Map 接口,但它们有一些重要的区别: HashMap 是非线…...
LeetCode刷题小记 三、【哈希表】
1. 哈希表 文章目录 1. 哈希表写在前面1.1 理论基础1.2 有效的字母异位词1.3 两个数组的交集1.4 快乐数1.5 两数之和1.6 四数相加||1.7 赎金信1.8 三数之和(哈希法梦碎的地方)1.9 四数之和 Reference 写在前面 本系列笔记主要作为笔者刷题的题解&#x…...
Zookeeper选举Leader源码剖析
Zookeeper选举Leader源码剖析 leader选举流程 参数说明 myid: 节点的唯一标识,手动设置zxid: 当前节点中最大(新)的事务idepoch-logic-clock: 同一轮投票过程中的逻辑时钟值相同,每投完一次值会增加 leader选举流程 默认投票给自己,优先选择…...
Redis(十六)缓存预热+缓存雪崩+缓存击穿+缓存穿透
文章目录 面试题缓存预热缓存雪崩解决方案 缓存穿透解决方案 缓存击穿解决方案案例:高并发聚划算业务 总结表格 面试题 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何避免或者减少缓存雪崩?穿透和击穿有什么区别?他两是…...
[已解决]npm淘宝镜像最新官方指引(2023.08.31)
最新的配置淘宝镜像的淘宝官方提供的方法 npm config set registry https://registry.npmmirror.com原来的 registry.npm.taobao.org 已替换为 registry.npmmirror.com ,当点击 registry.npm.taobao.org 会默认跳转到 registry.npmmirror.com 如果你想将npm的下载…...
ffmpeg之avformat_alloc_output_context2
函数原型: int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat,const char *format_name, const char *filename); 功能: 根据format_name或者filename或者oformat查找输出类型,并且初始化ctx结构。 参数: ctx:AVFormatContext…...
GitLab代码库提交量统计工具
1.说明 统计公司所有项目的提交情况,可指定分支和时间段,返回每个人的提交新增数、删除数和总数。 2.API 文档地址:http://公司gitlab域名/help/api/README.md 项目列表查询 返回示例: [{"id": 1, //项目ID"http…...
Python爬虫技术详解:从基础到高级应用,实战与应对反爬虫策略【第93篇—Python爬虫】
前言 随着互联网的快速发展,网络上的信息爆炸式增长,而爬虫技术成为了获取和处理大量数据的重要手段之一。在Python中,requests模块是一个强大而灵活的工具,用于发送HTTP请求,获取网页内容。本文将介绍requests模块的…...
关于TypeReference的使用
关于TypeReference的使用 在项目中,有遇到TypeReference的使用,其主要在字符串转对象过程中,对于序列化和反序列化中也有效果,将字符串转换成自定义对象. 1 说明 以常见为例,在com.alibaba.fastjson包下面的TypeReference类,是指Type的Reference,表示某类型的一个指…...
阿里大文娱前端一面
引言 我目前本科大四,正在春招找前端,有大厂内推的友友可以聊一聊,球球给孩子的机会吧。 我整理了一份10w字的前端技术文档:https://qx8wba2yxsl.feishu.cn/docx/Vb5Zdq7CGoPAsZxMLztc53E1n0k?fromfrom_copylink,对…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
