C++继承与派生
1.基本知识
类的继承是新类从已有类那里获得特性,从已有的类产生新类的过程称为类的派生;
已有类称为基类或父类,派生出的新类则称为派生类或子类;
继承的功能:
(1)使得基类与派生类之间建立起逻辑上的层次关系;(2)使得派生类获得其基类的属性和行为
例如:人与动物,动物就为基类,而人为派生类
分类:单继承:只有一个直接基类;多继承:有多个直接基类
比如:Base:基类;Derived:派生类
基类与派生类之间的关系:
(1)基类是对派生类的抽象;派生类是对基类的具体化,是基类的延续;
(2)派生类是基类的组合,多继承可以看作是多个单继承的简单组合;
(3)公有派生类的对象可以作为基类的对象处理;
2.声明派生类
class <派生类名> : <继承方式> <基类名>
class Base
{
private:int a;
public:void inita(int x);
};class Derived :public Base
{
private:int b;
public:void initb(int y);
};
3.成员的访问
3.1类的成员的访问说明符
private:私有,只能被类自身的成员和友元访问
public:公有,可以被任何普通函数和任何类的成员函数或子类访问
protected:保护,可以被类自身的成员和友元,派生类的成员函数访问;
3.2继承方式
public:公有继承;private:私有继承;protected:保护继承
基类中的私有成员在派生类中是隐藏的,只能在基类内部访问;
派生类从基类私有继承时,基类的公有和保护成员在派生类中都改为私有成员;
派生类从基类公有继承时,基类的公有和保护成员在派生类中仍为公有和保护成员;
派生类从基类保护继承时,基类的公有成员在派生类中改为保护成员,保护成员不变;
3.2.1私有继承
此时派生类的成员函数只能通过基类的公有或保护成员函数间接访问。——所以在设计基类时,通常都要为其私有成员提供能够访问他们的公有成员函数,以便派生类和外部函数能够间接访问;
class Base
{
private:int a;
public:void inita(int x)//这个inita就是派生类能够访问的基类的公有或保护成员函数{a = x;}int geta(){return a;}
};class Derived :private Base//私有继承一般用的比较少
{
private:int b;
public:void initb(int y, int x){b = y;inita(x);}int getb(){return b * geta();}
};int main()
{Derived ob;ob.initb(5, 7);cout << ob.getb() << endl;return 0;
}
3.2.2公有继承
基类的成员函数可以直接访问他们,而外部函数只能通过派生类的对象间接访问;
class Base
{
private:int a;
public:void inita(int x){a = x;}int geta(){return a;}
};class Derived :public Base
{
private:int b;
public:void initb(int y){b = y;}int getb(){return b * geta();}
};int main()
{Derived ob;ob.inita(12);//直接调用ob.initb(5);cout << "the result of ob getb() is:" << ob.getb() << endl;return 0;
}
公有继承的注意事项:派生类以公有的方式继承自基类,并不是说派生类就可以访问基类的私有成员;继承自基类,仍然不改变基类成员的访问权限,因此基类中的私有成员依然是私有的不可访问
派生类中声明的成员名如果与基类中声明的成员名相同,则派生类中的成员起支配作用;
class Base
{
public:int a();
};class Derived :public Base
{int a();int b();
};void Derived::g()
{a();//此时被调用的函数是Derived::a(),而不是Base::a()
}
被调用的函数是Derived::a(),而不是Base::a()
上述结论也适用于派生类的对象的引用——Derived obj; obj.a()此时即使基类与派生类中的函数同名,调用的也是Derived::a()
(此时,要使用基类中的同名成员,要加作用域运算符限定)——obj.Base::a()才会调用基类的
3.2.3保护继承
派生类的所有成员在类的外部都无法访问它们;
class Base
{
private:int a;
protected:int b;
public:int c;void setab(int x, int y){a = x;b = y;}int geta(){return a;}
};class Derived :protected Base
{
private:int c;
public:void setabc(int m, int n, int l){setab(m, n);b = m;//可以访问protect继承的成员c = l;}int getc(){c = c + b * geta();return c;}
};int main()
{Derived ob;//ob.setabc();//非法:不能通过类外对象访问从基类保护继承来的成员ob.setabc(12, 12, 5);cout << "the result of obgetc()is:" << ob.getc() << endl;return 0;
}
关键就是:不能通过类外对象访问从基类保护继承来的成员;
3.2.4特殊方法的继承——派生类的构造函数和析构函数
在C++中,基类成员的初始化工作由基类的构造函数完成,而派生类的初始化工作由派生类的构造函数完成;
(1)构建原则
基类和派生类都需要调用构造函数来实现初始化成员,这就产生了派生类构造函数和析构函数。
构建时要遵循的原则:
a.基类的构造函数和析构函数不能被派生类继承;如何实现?
b.如果基类没有定义构造函数,派生类也可以不定义构造函数,全都采用默认的构造函数
c.如果基类定义了带有形参表的构造函数,派生类就必须定义新的构造函数,提供一个将参数传递给基类构造函数的途径;
d.如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造(只服从于直接领导)
e.派生类是否要定义析构函数与所属的基类无关;
(2)派生类构造函数的创建
派生类的构造函数需要用合适的初值作为参数,隐含调用基类的构造函数和新增对象成员的构造函数来初始化各自的成员,再用新加的语句对新增数据成员进行初始化。派生类构造函数声明的一般形式:
<构造函数名>(参数总表):基类名(参数表),对象成员名1(参数表1).....对象成员名n(参数表n)
class Base
{int i;
public:Base(int n){;}
};class Derived :public Base
{int j;Base ob;
public:Derived(int m) :Base(m), ob(m)//调用基类的构造函数和新增对象成员的构造函数来初始化各自的数据成员;{;}
};
(3)派生类析构函数的构建
派生类析构函数功能与基类析构函数的功能一样;
析构函数不能被继承,如果需要析构函数,则需要在派生类中重新定义。并且派生类的析构函数也没有数据类型和参数;
class Base
{int i;
public:Base(int n){cout << "constructing Base class\n";i = n;}~Base(){cout << "destructing Base class\n";}void showi(){cout << i << endl;}
};class Derived :public Base
{
private:int j;Base ob;//基类对象作为派生类对象成员
public:Derived(int n) :Base(n), ob(n)//派生类构造函数//那其实从这个例子可以看出,在调用派生类的构造函数的时候就自动调用了基类的构造函数,以及为新建立的对象也进行了赋值{cout << "constructing Derived class" << endl;j = 2 * n;}~Derived(){cout << "destructing Derived class\n" << endl;}void showj(){cout << j << endl;}
};int main()
{Derived ob(10);ob.showi();ob.showj();return 0;
}
可以看出派生类的析构函数的构建与普通类的析构函数的构建没有区别;
并且经过上述例子我们可以看出:通过派生类的构造函数,我们同时“调用”了基类中的构造函数,使得基类中的成员也成功初始化!
相关文章:
C++继承与派生
1.基本知识 类的继承是新类从已有类那里获得特性,从已有的类产生新类的过程称为类的派生; 已有类称为基类或父类,派生出的新类则称为派生类或子类; 继承的功能: (1)使得基类与派生类之间建立…...

Survival Animations
一套生存游戏的动画集,包括采集、建造、捕鱼、剥皮/鞣制、篝火等更多内容。 总动画数:89 建造/制作 30 篝火 28 饮水 3 水壶 3 觅食 2 治疗 3 空闲 1 原始捕鱼 7 剥皮 1 矛捕鱼 4 伐木 5 下载:Unity资源商店链接资源下载链接 效果图:...
Cargo 教程
Cargo 教程 1. 引言 Cargo 是 Rust 编程语言的包管理器和构建工具。它为 Rust 项目提供了依赖管理、编译和打包等功能。本教程将详细介绍 Cargo 的基本用法,帮助您快速上手 Rust 项目开发。 2. 安装 Cargo 在开始使用 Cargo 之前,您需要确保已经安装了 Rust 编程语言。Ru…...

linux中“PXE高效批量装机”
在大规模的 Linux 应用环境中,如 Web 群集、分布式计算等,服务器往往并不配备光驱设备,在这种情况下,如何为数十乃至上百台服务器裸机快速安装系统呢?传统的 USB光驱、移动硬盘等安装方法显然已经难以满足需求。 PXE …...

emm, ComfyUI的作者从Stability.AI离职了
🍖背景 今天在更新ComfyUI的过程中,看到Manager中有这样一段描述: 嗯?做了新的官方网站?然后开始新篇章? 难道说ComfyUI的作者从Stability.AI离职了? 赶紧点开链接看了下,emm&…...

Redis-五种数据结构之列表(ziplist、quicklist)
列表 文章目录 列表压缩列表-ziplistziplist 定义级联更新 快速列表-quicklistquicklistNode 定义quicklist 定义quicklist常用操作其他操作quicklist 相对于普通链表优点quick应用场景在redis 中使用quicklist 列表数据类型可以存储一组按插入顺序排序的字符串,他很…...

记一次全设备通杀未授权RCE的挖掘经历
想来上一次挖洞还在一年前的大一下,然后就一直在忙活写论文,感觉挺枯燥的(可能是自己不太适合弄学术吧QAQ),所以年初1~2月的时候,有空的时候就又会挖一挖国内外各大知名厂商的设备,拿了几份思科…...

【数据库编程-SQLite3(一)】sqlite3数据库在Windows下的配置及测试
学习分析 1、资源准备2、环境配置2.1、将资源包下载解压缩保存。2.2、在QT中创建工程,配置环境 3、测试配置3.1、 sqlite3_open函数3.2、sqlite3_close函数3.3、代码测试 1、资源准备 资源包 2、环境配置 2.1、将资源包下载解压缩保存。 解压缩得到以下文件 2.2、在QT中创建…...

YOLOv10改进 | 主干篇 | YOLOv10引入华为VanillaNet替换Backbone
1. VanillaNet介绍 1.1 摘要: 基础模型的核心是“越多越好”的理念,计算机视觉和自然语言处理领域取得的惊人成功就是例证。 然而,优化的挑战和变压器模型固有的复杂性要求范式向简单性转变。 在这项研究中,我们介绍了 VanillaNet,一种设计优雅的神经网络架构。 通过避免…...
C++ 迷宫问题
描述 定义一个二维数组 N*M ,如 5 5 数组下所示: int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走…...
【Linux】Linux文件系统中主要文件夹列举_作用说明
在Linux系统中,文件夹(或称为目录)的组织结构是系统功能和用户数据的重要组成部分。以下是Linux系统中一些主要文件夹的列举及其作用说明: / (根目录): 是Linux文件系统的起点。通常只包含其他目录,不建议直接在其中存…...

移植案例与原理 - HDF驱动框架-驱动配置(1)
HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。应该,类似Linux DTS(Device Tree Source)设备树。 HC-GEN(HDF Configuration Generator)是…...

坚持刷题|反转链表
文章目录 题目思考实现1. 迭代方式实现链表翻转2. 递归方式实现链表翻转 Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,今天继续链表:反转链表 题目 LCR 024. 反转链表 思考 翻转链表是一个常见的算法问题&a…...

升级和维护老旧LabVIEW程序
在升级老旧LabVIEW程序至64位环境时,需要解决兼容性、性能和稳定性等问题。本文从软件升级、硬件兼容性、程序优化、故障修复等多个角度详细分析。具体包括64位迁移注意事项、修复页面跳转崩溃、解决关闭程序后残留进程的问题,确保程序在新环境中的平稳运…...
sqlite数据库整体迁移进mysql整个流程并解决中文异常问题
咨询【QQ】 sqlite轻量数据还行,随着数据量增大,不得不迁移进mysql 首先 电脑执行 sqlite3 db.sqlite3 .dump > dump.sql 会把整个sqlite的数据导出进 dump.sql中 紧接着我们把sqlite的sql转换成mysql的sql语句,因为mysql语句和 sq…...

Hadoop3:MapReduce中的Partition原理及自定义Partition
一、默认Partition分区配置 以WC案例来进行验证。 1、设置setNumReduceTasks 修改的代码 这行代码,确定了reduceTask的数量,也确定了分区逻辑 在mapper文件中,打上断点 计算分区的代码 这里会对每一个kv进行计算,然后&#…...

就因为没在大屏项目加全屏按钮,早上在地铁挨了领导一顿骂
“嗯嗯”,“嗯嗯”,“那产品也没说加呀”,“按F11不行吗?”,“嗯嗯”,“好的”。 早上在4号线上,我正坐在地铁里,边上站着的妹子,我看他背着双肩包,打着电话…...

STM32学习记录(八)————定时器输出PWM及舵机的控制
文章目录 前言一、PWM1.工作原理2.内部运作机制3. PWM工作模式4.PWM结构体及库函数 二、PWM控制舵机 前言 一个学习STM32的小白~ 有错误评论区或私信指出提示:以下是本篇文章正文内容,下面案例可供参考 一、PWM 1.工作原理 以向上计数为例࿰…...

Vue CLI,Vue Router,Vuex
前言 Vue CLI、Vue Router 和 Vuex 都是 Vue.js 生态系统中的重要组成部分,它们在构建 Vue 应用程序时扮演着关键角色。 Vue CLI Vue CLI 介绍 Vue CLI 是 Vue.js 的官方命令行工具,用于快速搭建 Vue.js 项目。它提供了一个图形界面(通过…...
互联网广告相关概念
互联网广告概念涉及多个关键指标和定价模式,它们帮助广告主和广告平台衡量广告效果、优化广告投放策略,并计算广告成本。以下是互联网广告中一些核心概念的简要概述: 1.ROI (投资回报率) 衡量广告投资的效益,计算公式为ÿ…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...