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 (投资回报率) 衡量广告投资的效益,计算公式为ÿ…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...