当前位置: 首页 > news >正文

【C++】你不得不爱的——继承

 凡是面向对象的语言,都有三大特性,继承,封装和多态,但并不是只有这三个特性,是因为者三个特性是最重要的特性,那今天我们一起来看继承!


目录

1.继承的概念及定义

1.概念

2.继承的定义

2.基类和派生类对象赋值转换

3.继承中的作用域

4.派生类的默认成员函数

1.构造和拷贝构造,赋值

2.析构函数的两怪!

5.继承与友元

6. 继承与静态成员

7.多继承

7.1继承分类

7.2 菱形继承 &&菱形虚拟继承

1.解决二义性的过程(指定作用域)

2.解决数据冗余(需要虚继承)

8.继承和组合(都是一种复用)

总结:


1.继承的概念及定义

1.概念

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在
持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。(子类)
继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,承是类设计层次的复用。
那到底是什么意思呢?举个例子:
class Person
{
protected:char* _name;int _old;
};class student :public Person
{
private:char* _id;
};
int main()
{student s;
}

当好多类都需要写Person类中的成员时 ,为了避免数据冗余,就可以使用类的继承,使代码复用,继承是让每一个派生类中,都有一份基类(父类)的成员。

2.继承的定义

继承的方式:(当然继承的目的就是为了让子类可以拥有父类的成员,并访问,所以一般情况下,我们只会进行公有继承:public:)

 那么我们来看一下,继承方式和访问之间的关系:

首先必须知道的一点是:基类中有私有成员时,子类中继承的父类的私有成员不可见。

不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。)

其次就是,基类成员的权限和继承方式的权限,谁的权限更小,在子类中继承的成员就是更小的那个权限。public > protected> private。

 如上图所示:


2.基类和派生类对象赋值转换

首先得回想起赋值转换这个过程:

不同的类型相互赋值时,中间会产生临时变量,通过临时变量进行赋值转换。

但是若子类和父类进行赋值交换时,并不产生中间的临时变量,而是天然的一个赋值。

(只能向上转换,即子类赋值给父类,字可以给父,父不可以给子)

看下面代码:

class Person
{
protected:string _name; // 姓名string _sex;  // 性别
public:int	_age;	 // 年龄
};class Student : public Person
{
public:int _No; // 学号
};int main()
{int i = 1;double d = 2.2;//中间会产生一个临时变量,临时变量具有常性,不可以改变。i = d;//所以此时ri是中间的临时变量的引用,而不是d的引用,如果不加const,就会放大权限const int& ri = d;//但父类和子类之间的赋值就不会产生中间的临时变量Person p;Student s;// 中间不存在类型转换,天然的一个赋值p = s;Person& rp = s;//对s的引用,可以访问和修改成员变量rp._age = 1;Person* ptrp = &s;ptrp->_age++;return 0;
}
派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用这里有个形象的说法叫切片
或者切割。寓意把派生类中父类那部分切来赋值过去。
切片的具体过程,我们画图来了解:

 

只能向上转换,即子类赋值给父类,字可以给父,父不可以给子


3.继承中的作用域

我们知道,一个类他就是一个域(作用域)。同一作用域不能定义同名的两个变量,但不同作用域它可以定义两个同名变量。所以父类,子类中都有同名的成员变量时,默认会自动访问子类的成员,因为就近原则,若想访问父类的成员,那就可以指定作用域!

同一作用域,定义两个同名函数,且参数不同叫做函数重载;

不同作用域,定义两个同名函数,叫做重定义;

1. 在继承体系中基类派生类都有独立的作用域
2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,
也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问
3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
4. 注意在实际中在继承体系里面最好不要定义同名的成员

举例说明:

class A
{
public:void fun(){cout << "A::func()" << endl;}
};class B : public A
{
public:void fun(int i){cout << "B::func(int i)->" << i << endl;}
};void Test()
{B b;b.fun(10);
};

这中情况,函数构成什么???函数重载?? 重定义(隐藏)??编译错误???

首先我们知道两个类中的同名函数,在不同作用域,这就构成了重定义(隐藏)!

若访问父类成员函数即:b.A::fun();


4.派生类的默认成员函数

1.构造和拷贝构造,赋值

先回顾一下,默认成员函数(无参,全缺省,编译器自己生成)

具体分析:

class Person  //父类
{
public:Person(const char* name) : _name(name){cout << "Person()" << endl;}Person(const Person& p): _name(p._name){cout << "Person(const Person& p)" << endl;}Person& operator=(const Person& p){cout << "Person operator=(const Person& p)" << endl;if (this != &p)_name = p._name;return *this;}~Person(){cout << "~Person()" << endl;}
protected:string _name; // 姓名
};class Student : public Person //子类
{
public:Student(const char*name, int num)
//子类显示构造时,父类不可以直接访问进行初始化,必须调用父类自己的显示构造函数:Person(name)  , _num(num){}Student(const Student& s)
//子类显示拷贝构造时,父类不可以直接访问进行初始化,必须调用父类自己的显示拷贝构造函数:Person(s), _num(s._num){}Student& operator=(const Student& s){if (this != &s){
//赋值的运算符重载,两个同名函数构成了隐藏,需要指定作用域Person::operator=(s);_num = s._num;}return *this;}protected:int _num; //学号
};int main()
{Student s1("张三", 18);Student s2(s1);Student s3("李四", 20);s1 = s3;return 0;
}

最重要的一句话:父类成员必须调用父类自己的构造函数,拷贝构造完成初始化或拷贝。

或者说:子类中的父类那部分成员由父类自己的构造或者拷贝构造实现初始化或者拷贝。

2.析构函数的两怪!

直接看代码:

class Person
{
public:Person(const char* name = " "): _name(name){cout << "Person()" << endl;}Person(const Person& p): _name(p._name){cout << "Person(const Person& p)" << endl;}Person& operator=(const Person& p){cout << "Person operator=(const Person& p)" << endl;if (this != &p)_name = p._name;return *this;}~Person(){cout << "~Person()" << endl;delete[] p;}protected:string _name; // 姓名int* p = new int[10];
};class Student : public Person
{
public:Student(const char* name):Person(name), _num(1){}Student(const Student& s): Person(s), _num(s._num){cout << "Student(const Student& s)" << endl;}Student& operator= (const Student& s){cout << "Student& operator= (const Student& s)" << endl;if (this != &s){Person::operator =(s);_num = s._num;}return *this;}// 第一怪:1、子类析构函数和父类析构函数构成隐藏关系。(由于多态关系需求,所有析构函数都会特殊处理成destructor函数名)// 第二怪:子类先析构,父类再析构。子类析构函数不需要显示调用父类析构,子类析构后会自动调用父类析构~Student(){//Person::~Person();cout << "~Student()" << endl;}protected:int _num; //学号
};int main()
{Student s("张三");return 0;
}

1、子类析构函数和父类析构函数构成隐藏关系。(由于多态关系需求,所有析构函数都会特殊处理成destructor函数名)
2.子类先析构,父类再析构。子类析构函数不需要显示调用父类析构,子类析构后会自动调用父类析构

构造顺序:先父类,再子类;析构顺序:先子类,再父类。


5.继承与友元

友元关系不能继承!

 若子类对象也想访问友元函数,那只能在子类中也加上友元!(但不建议使用友元,会破坏继承关系)


6. 继承与静态成员

子类继承父类,不是继承父类这个对象,而是会有一份父类的模型。父类有的成员变量,子类也会有一份,互不干扰。

但静态成员就不一样了,他们是同一份;静态成员属于整个类和类的所有对象。同时也属于所有派生类及派生类的对象。

class Person
{
public://friend void Display(const Person& p, const Student& s);
protected:string _name; // 姓名
public:static int _num;
};
int Person::_num = 0;class Student : public Person
{
protected:int _stuNum; // 学号
};void test()
{Student s;Person p;cout << p._num << endl;p._num++;cout << p._num << endl;s._num++;cout << s._num << endl;cout << &s._num << endl;cout << &p._num << endl;
}

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子
类,都只有一个static成员实例
 重点:
Person* ptr = nullptr;ptr->Print();cout << ptr->_num << endl;cout << ptr->_name << endl;cout << (*ptr)._num << endl;(*ptr).Print();

对象里面只存成员变量,成员函数在代码段中,所以以上代码哪个不对呢?

我们知道空指针不能解引用,解引用意思是,这里是去访问指针指向对象的内部成员,那看一看哪个访问了内部的成员呢?

函数不在内部,在代码段,可以!

_num为对象内部成员变量,不能解引用访问,不可以!

(*ptr)是解引用了吗?我们不能凭借解引用符号来判断是否解引用,我们需要看内部的访问情况,(*ptr)->Print();并没有访问内部成员,可以!

(*ptr)->_num;也可以,_num是静态成员,不在成员里面。


7.多继承

7.1继承分类

单继承:一个子类只有一个直接父类

多继承:一个子类有两个或两个以上的父类

菱形继承:是多继承的一种特殊情况,会产生数据冗余和二义性!

 (person类的中的成员,会在student和teacher中都有一份,assistant继承student和teacher时,assistant中会有两份person,造成了数据冗余和二义性)

解决方法:

解决二义性:

可以通过访问限定符来指定访问哪一个成员。

那如何解决二义性的问题呢?

此时虚继承就上线了!

虚继承在腰部继承,谁引发的数据冗余,谁就进行虚继承(解决冗余)

 由此可见,加上virtual,变为虚继承以后,确实解决了数据的冗余

 那么到底如何解决的呢??具体下面分析!

7.2 菱形继承 &&菱形虚拟继承

为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成
员的模型。

1.解决二义性的过程(指定作用域)

(菱形继承)
class A
{
public:int _a;
};class B:public A
{
public:int _b;
};class C:public A
{
public:int _c;
};class D:public B,public C
{
public:int _d;
};int main()
{D d;d._b = 1;d._c = 2;d._d = 3;d.B::_a = 4;d.C::_a = 5;
}

2.解决数据冗余(需要虚继承)

(菱形虚拟继承)

class A
{
public:int _a;
};class B:virtual public A
{
public:int _b;
};class C:virtual public A
{
public:int _c;
};class D:public B,public C
{
public:int _d;
};int main()
{D d;d._b = 1;d._c = 2;d._d = 3;d.B::_a = 4;d.C::_a = 5;
}

 那如果遇到这种情况呢???父子类的赋值转换(切片)

class A
{
public:int _a;
};class B:virtual public A
{
public:int _b;
};class C:virtual public A
{
public:int _c;
};class D:public B,public C
{
public:int _d;
};int main()
{D d;d._b = 1;d._c = 2;d._d = 3;d._a = 4;d._a = 5;B b;b._a = 1;b._b = 3;B* ptr = &b;ptr->_a = 2;ptr = &d;ptr->_a = 6;
}

从b对象可以看的出来,只要是虚继承以后,就会把虚基类放到最下面;

就像切片这种情况,ptr指向不同,那么距离虚基类的距离就不同,所以就必须要有虚基表的地址,来访问虚基表继而找到偏移量,然后访问到虚基类! 

我们通常使用下,很忌讳出现菱形继承,但可以多继承。

可以看得出,虚继承在时间上确实有损耗,过程比较复杂,但是如果虚基类比较大时,就可以很大程度上节省内存。


8.继承和组合(都是一种复用)

public继承是一种is-a(是一个)的关系。也就是说每个派生类对象都是一个基类对象。
组合是一种has-a(有一个)的关系。假设B组合了A,每个B对象中都有一个A对象。
我们会说低耦合高内聚有,意思就是相互的联系比较小,不会因为改动一个,而很大的影响另一个;
在组合中,两个类中的成员变量一般都是私有,那么就无法访问,那么修改也不会相互影响到;
在继承中,因为要继承,所以父类成员一般子类都可以访问的,那么修改的话,彼此相互影响就比较大!
那么组合其实就是很好的低耦合。
就比如我们平时举例说到的:person,student,这就是继承关系,学生是一个人;
那再举一个,头有一双眼睛(这就是组合)
事实上,哪个适合就用哪个,都适合就先用组合!

总结:

一口气说了这么多,你学会了吗?细节还是比较多的,我们应该下去多多自己琢磨,反复调试,去感受过程,从而理解的更深刻!下期再见!

相关文章:

【C++】你不得不爱的——继承

凡是面向对象的语言&#xff0c;都有三大特性&#xff0c;继承&#xff0c;封装和多态&#xff0c;但并不是只有这三个特性&#xff0c;是因为者三个特性是最重要的特性&#xff0c;那今天我们一起来看继承&#xff01; 目录 1.继承的概念及定义 1.概念 2.继承的定义 2.基类…...

数据库系统概论

文章目录前言基础篇&#xff1a;1-5章第 1 章 绪论1.1 数据库系统概述1.2 数据模型1.3 数据库系统的结构1.4 数据库系统的组成1.5 小结第 2 章 关系数据库1.关系模型1.1 关系数据结构1.2 关系完整性约束实体完整性、参照完整性、用户定义完整性2.关系代数8种关系代数运算符并 ∪…...

32位处理器AM6528BACDXEA、AM6548BACDXEAF基于Arm Cortex-A53内核【工业4.0嵌入式产品应用】

AM6528BACDXEA、AM6548BACDXEAF 处理器是专为满足工业4.0嵌入式产品对处理性能的复杂需求而设计的Arm应用处理器。AM654x和AM652x器件将四个或两个Arm Cortex-A53内核与一个双Arm Cortex-R5F MCU子系统结合在一起。这些包含的功能旨在帮助客户实现终端产品的功能安全目标。它还…...

多图片怎么转换成PDF?这招教你轻松转换

多图片怎么转换成PDF&#xff1f;我们经常会传输图片文件给同事或者朋友&#xff0c;但是多张图片的传输比较麻烦&#xff0c;有的时候传输比较慢&#xff0c;而且也不便于查看&#xff0c;所以我们就可以将需要传输的多张图片转换成一个PDF文件&#xff0c;这样查看文件时就可…...

kali双网卡

先单独开启一个网卡&#xff0c;配置/etc/network/interfaces 修改为如下配置 This file describes the network interfaces available on your system and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* The loopb…...

【wed前端初级课程】第一章 什么是HTML

什么是WEB前端&#xff1f; 简单来说就是网页&#xff0c;只是这个网页它是由多种技术参与制作的&#xff0c;用来向用户展示的页面。 HTML(超文本标签语言)&#xff1a;它决定了网页的结构。 CSS&#xff1a;网页的装饰器。 JavaScript&#xff1a;JavaScrip最初是因为校验…...

sd卡格式化后数据恢复怎么操作

有时候我们需要清空SD卡数据文件&#xff0c;有时候则是因为需要修复SD卡所以需要格式化&#xff0c;但是却被提示无法格式化SD卡。这种情况往往是由于平时SD卡使用时的一些不良习惯或是SD卡中病毒&#xff0c;病毒在运行SD卡中的软件所造成的。那么sd卡格式化后数据恢复怎么操…...

论文阅读笔记|大规模多标签文本分类

多标签文本分类&#xff08;Extreme Multi Label Classification, MLTC&#xff09;是自然语言处理领域中一个十分重要的任务&#xff0c;其旨在从一个给定的标签集合中选取出与文本相关的若干个标签。MLTC可以广泛应用于网页标注&#xff0c;话题识别和情感分析等场景。大规模…...

国际化翻译navigator.language与语种对照表

代码(navigator.language) 语种 字段名 "zh-CN", 中文 Chinese "zh-SG" 马新简体 Chinese_SG "zh-TW","zh-HK", 繁体中文 Chinese_TW "en", "en-US"&#xff08;美国&#xff09;, "en-EG"…...

Matlab进阶绘图第6期—雷达图/蜘蛛图/星图

雷达图&#xff08;Radar Chart&#xff09;&#xff0c;又称星图、蜘蛛图、蜘蛛网图、网络图、Kiviat图等&#xff0c;是一种以从同一点开始的轴上表示的三个以上变量的二维图表的形式&#xff0c;来显示多变量数据的图形方法。 雷达图可以直观地对多维数据集目标对象的性能、…...

Javascript的ES6 class写法和ES5闭包写法性能对比

看到很多闭包写法的函数, 一直怀疑它对性能是否有影响. 还有就是备受推崇的React Hooks函数式写法中出现大量的闭包和临时函数, 我很担心这样会影响性能. 于是, 做了一个实验来做对比. 这个实验很简单, 用md5计算一百万次. 计算过程将结果再放回参数, 这样避免结果没被引用被…...

探秘MySQL——全面了解索引、索引优化规则

文章目录0.什么是索引1.常用索引分类逻辑维度底层数据结构维度物理维度&#xff08;InnoDB&#xff09;2.为什么底层是B树平衡二叉查找树红黑树B树&#xff08;多叉&#xff09;B树&#xff08;多叉&#xff09;3.MySQL索引优化SQL性能分析之explainQ.MySQL如何查看查询是否用到…...

战斗力最强排行榜:10-30人团队任务管理工具

工欲善其事&#xff0c;必先利其器。在高效的任务执行过程中&#xff0c;选择灵活轻便的项目管理工具来提升工作效率、适应快速多变的发展诉求&#xff0c;对团队来说&#xff0c;至关重要。但是如果团队不大&#xff0c;企业对这块的预算又有限&#xff0c;大型的团队任务管理…...

2023-03-09干活小计

强化学习&#xff1a; 强化学习用智能体&#xff08;agent&#xff09;这个概念来表示做决策的机器。 感知、决策和奖励 感知。智能体在…...

基数排序算法

目录&#xff1a;什么是基数排序&#xff1f;基本原理核心思想实现逻辑代码实现复杂度分析总结什么是基数排序&#xff1f; 基数排序&#xff1a;基数排序&#xff08;Radix sort&#xff09;是一种非比较型整数排序算法&#xff0c; 基本思想主要是通过关键字间的比较和移动记…...

项目实战典型案例24——xxljob控制台不打印日志排查

xxljob控制台不打印日志排查一&#xff1a;背景介绍问题截图问题解读二&#xff1a;思路&方案三&#xff1a;过程四&#xff1a;总结一&#xff1a;背景介绍 本篇博客是对xxljob控制台不打印日志排查进行的总结和进行的改进。 目的是将经历转变为自己的经验。通过博客的方…...

旋转框目标检测mmrotate v1.0.0rc1 之RTMDet训练DOTA的官方问题解析整理(四)

关于rotated_rtmdet_l-coco_pretrain-3x-dota_ms.py配置文件的batchsize和学习率设置问题&#xff1a;回答&#xff1a;如何在mmrotate中绘制特征图问题&#xff1a;回答&#xff1a;你好AllieLan&#xff0c;您可以尝试使用https://github.com/open-mmlab/mmyolo/blob/main/de…...

4个顶级的华为/小米/OPPO/Vivo手机屏幕解锁工具软件

有好几次用户发现自己被锁定在他们的华为/小米/OPPO/Vivo设备之外&#xff0c;我们知道这可能是一种非常可怕的体验。在这种情况下&#xff0c;找到安卓手机解锁软件&#xff0c;重新获得手机中重要数据和文件的访问权限。看看这篇文章&#xff0c;因为我们将与您分享什么是解锁…...

华为OD机试题 - 和最大子矩阵(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:和最大子矩阵题目输入输出示例一输入输出说明Code思路版权说明华…...

企业电子招标采购系统源码之项目说明和开发类型

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…...

Python高频面试题——装饰器(带大家理解装饰器的本质)

装饰器概念装饰器本质上是一个python函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能&#xff0c;装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景&#xff0c;比如&#xff1a;插入日志、性能测试、事务处理、缓存、权限验证等场景…...

全方位解读智能中控屏发展趋势!亚马逊Alexa语音+Matter能力成必备

随着智能家居行业逐步从碎片化的智能单品阶段&#xff0c;迈向体验更完整的全屋互联阶段&#xff0c;智能中控屏作为智能家居最佳的入口之一&#xff0c;在年轻人青睐全屋智能装修的风潮下&#xff0c;市场潜力彻底被引爆。 一、为什么是智能中控屏&#xff1f; 在智能音箱增…...

JAVA练习74-括号生成

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 3月10日练习内容 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目-…...

Java ORM开发 更全面的应用场景

1. 一个web系统, 想支持多种数据库, 如同时要用mysql, oracle 需要动态切换数据源? 2. 读写分离, 但读库与写库是不同的类型, 如分别是: mysql, oracle 3. 智能化自动过滤null和空字符串&#xff0c;不再需要写判断非空的代码。 4.动态/任意组合查询条件,不需要提前准备da…...

SpringBoot【基础篇】---- 基础配置

SpringBoot【基础篇】---- 基础配置1. 属性配置2. 配置文件分类3. yaml 文件4. yaml 数据读取1. 读取单一数据2. 读取全部数据3. 读取对象数据yaml 文件中的数据引用1. 属性配置 SpringBoot 通过配置文件 application.properties 就可以修改默认的配置&#xff0c;那咱们就先找…...

手机磁吸背夹散热器制冷快速方案

手机散热器是什么&#xff1f;手机散热器分为几种类型&#xff1f;手机散热的方式都有哪些&#xff1f; 因为经常玩游戏&#xff0c;手机发热得厉害&#xff0c;都可以煎鸡蛋了&#xff0c;心想着要买个东西给手机散散热&#xff0c;没想到还真的有手机散热器。 不知道手机散…...

青岛OJ(QingdaoU/OnlineJudge)部署如何直连数据库批量修改

1.postgres数据库QingdaoU/OnlineJudge用的数据库是postgreSQL&#xff0c;一个关系型数据库。默认端口是5432&#xff0c;我们下载一个navcat 15以上的版本&#xff0c;用来连数据库。2.修改docker-compose.yml文件修改docker-compose.yml&#xff0c;手动添加一个端口&#x…...

渗透测试——信息收集(详细)

信息收集&#xff1a;前言&#xff1a;信息收集是渗透测试除了授权之外的第一步&#xff0c;也是关键的一步&#xff0c;尽量多的收集目标的信息会给后续的渗透事半功倍。收集信息的思路有很多&#xff0c;例如&#xff1a;页面信息收集、域名信息收集、敏感信息收集、子域名收…...

什么是谐波

什么是谐波 目录 1. 问题的提出 2. “谐”字在中英文中的原意 2.1 “谐”字在汉语中的原义 2.2 “谐”字对应的英语词的原义 3.“harmonics(谐波)”概念是谁引入物理学中的&#xff1f; 4.“harmonics(谐波)”的数学解释 1. 问题的提出 “谐波”这个术语用于各种学科&am…...

技术报告:程序员如何开发一个商城型购物网站

前言随着互联网的快速发展&#xff0c;电商行业正成为越来越多人的选择。而作为电商行业的主要参与者之一&#xff0c;商城型购物网站的开发则成为程序员不可避免的任务之一。本文将对商城型购物网站的开发进行详细阐述&#xff0c;包括需求分析、架构设计、技术选型、前后端开…...

DPDK系列之八虚拟化virtio

一、virtio的介绍 在一篇文章中对virtio进行了简单的说明。在早期的虚拟化的过程中&#xff0c;无论是KVM还是Vmware亦或是Xen&#xff0c;每个平台想当然的是自己搞自己的IO接口。这就和现在国内的互联各个平台都是大而全一样&#xff0c;怎么可能我用你的支付接口呢&#xf…...

直播间与2位优秀创作者分享经历

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 昨天&#xff0c;卢松松的直播间好像又被推荐给了2.9万人观看&#xff0c;讲了一个小时后直播间的人数一直攀升&#xff0c;最终冲破了2万人大关。晚些时候&#xff0c;白杨SEO也来到了我的直播间&…...

linux上快速安装 Flarum 指南

一、安装Composer Composer是PHP的依赖管理器(类似于Node.js的npm或Python的 pip ),它可用于当前流行的PHP平台,例如Drupal、Magento等。那么如何安装PHP Composer呢?本文将为大家介绍下在Debian 10上安装PHP Composer的教程。 在安装 Composer 之前,请确保您的 Debian …...

数学不好,英语不行,非本专业,可以学IT吗?

看到很多想入行IT编程的小伙伴&#xff0c;都会问一些比较类似的问题。 比如&#xff1a; 不是计算机专业的&#xff0c;可以学编程吗&#xff1f; 数学一直就不好&#xff0c;可以转行学IT吗&#xff1f; 学编程开发&#xff0c;对英语的要求会不会很高&#xff1f; 01、…...

软件测试13

Linux命令 1.pwd&#xff1a;查看当前所在的路径位置 2.ls&#xff1a;查看当前路径下有哪些文件 3.cd&#xff1a;切换路径 4.touch&#xff1a;创建普通文件&#xff0c;可以创建单文件&#xff0c;也可以创建多文件&#xff08;touch a&#xff0c;touch b c&#xff09; 5…...

React(八):引出Hook、useState、useEffect的使用详解

React&#xff08;八&#xff09;一、类组件的优劣势1.类组件的优势2.类组件的劣势&#xff08;1&#xff09;复杂组件会难以理解&#xff08;2&#xff09;复杂的class&#xff08;3&#xff09;组件复用状态很难二、Hook初体验useState1.使用Hook的计数器案例2.详解useState&…...

32*4VKL128 LQFP44超低功耗/超低工作电流/抗干扰LCD液晶段码驱动IC/LCD驱动芯片(IC) 适用于激光/红外线测距仪

产品型号&#xff1a;VKL128产品品牌&#xff1a;永嘉微电/VINKA封装形式&#xff1a;LQFP44产品年份&#xff1a;新年份原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01;VKL128概述:VKL128是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大128点&#xff08;3…...

自定义控件(?/N) - 事件分发

一、外部传递到ViewGroup中Activity会通过 getWindow( ) 获取PhoneWindow对象并调用它的superDispatchTouchEvent( )&#xff0c;该方法会调用它&#xff08;PhoneWindow&#xff09;的内部类 DecorView 的 superDispatchTouchEvent( )&#xff0c;而它&#xff08;DecorView&a…...

诗一样的代码命名规范

有文化&#xff1a;落霞与孤鹜齐飞&#xff0c;秋水共长天一色&#xff1b;没文化&#xff1a;太阳落山的时候&#xff0c;看见一只鸟在水上飞&#xff1b;日常编码中&#xff0c;代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图&#xff0c;也是一项必备的能力…...

L1-010 比较大小 L1-030 一帮一 L1-015 跟奥巴马一起画方块 L1-035 情人节

本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中将3个整数从小到大输出&#xff0c;其间以“->”相连。 输入样例: 4 2 8 输出样例: 2->4->8 // 题目链接 https://pintia.cn/prob…...

打怪升级之如何发送HEX进制的数据出去

Hex数据老大难 不少人都困扰于如何将电脑中读取到的string类型的数据变成整形发送出去。一半来说&#xff0c;不论你调用的通信方式是串口的还是网络的&#xff0c;亦或是PCIE的&#xff0c;其在电脑端的实际情况都是以系统API的形式呈现的。而系统API函数提供的接口&#xff…...

国产8K摄像机拍摄回顾与画面数据反馈

本文分析两款国产8K摄像机&#xff0c;一款是全画幅&#xff0c;一款是M43画幅。一、全新国产全画幅8K B1机器参数数据汇总&#xff1a;全画幅8K 60fps&#xff0c;受益于8K全画幅的优势与大幅升级的图像处理系统&#xff0c;BOSMA 8K摄像机系统提升到新的高度。拍摄支持&#…...

C++中拷贝构造和赋值重载的注意事项以及编译器的优化处理

C中拷贝构造和赋值重载的注意事项以及编译器的优化处理前言1. 拷贝构造和赋值重载的易混淆点和注意事项1.1 易混淆点1.2 注意事项2.编译器对拷贝构造和赋值重载的优化处理前言 本文可以帮助你对下面&#xff1a; &#xff08;1&#xff09;何时调用拷贝构造何时调用赋值重载 &a…...

Java设计模式_单例模式

Java设计模式_单例模式 亦称&#xff1a; 单件模式、Singleton 意图 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a…...

刚刚学完CSS :display float,flex flow 傻傻分不清了

目录 描述 示例&#xff1a; CSS 中的 display CSS 中的 float CSS 中的 flex 描述 刚刚学完CSS ,导致浮动&#xff08;float&#xff09;&#xff0c;弹性布局&#xff08;display:flex&#xff09;好几个字段配置属性已经分不清了。 display float 就同层级别&#xf…...

python建立图片索引数据库,根据一段文字,找到存放在电脑上最匹配的图片

python建立图片索引数据库&#xff0c;根据一段文字&#xff0c;找到存放在电脑上最匹配的图片 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、程序的用处 一键视频 可以根据一…...

MySQL OCP888题解048-letter N in slow query log(慢查询日志里的字母N)

文章目录1、原题1.1、英文原题1.2、中文翻译1.3、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3.1、知识点1&#xff1a;mysqldumpslow - 总结缓慢的查询日志文件4、实验4.1、实验14.1.1、实验目的4.1.2、实验前准备4.1.3、实验步骤4.1.4、实验结论5、总结1、原题 1.1…...

数据采集 - 笔记 2

1快速实现西门子S7系列PLC数据采集 快速实现西门子S7系列PLC数据采集 - 知乎 2 什么是时序数据库&#xff1f; 时序数据库&#xff08;Time Series Database&#xff09;是一种特殊类型的数据库&#xff0c;用于存储和处理时间序列数据。时间序列数据是指按时间顺序排列的数…...

电子技术——数字IC技术,逻辑电路和设计方法

电子技术——数字IC技术&#xff0c;逻辑电路和设计方法 在我们之前的学习中&#xff0c;我们学习了CMOS技术&#xff0c;然而CMOS技术并不是唯一的数字逻辑技术&#xff0c;因此&#xff0c;本节系统的介绍当今使用的数字技术和逻辑电路族。 数字IC技术和逻辑电路族 逻辑电…...

[ROS2 知识] 包依赖关系和rosdep详述

一、说明 如果你建立一个工作空间,试图将所有包的依赖项搞明白,或者期望将包的依赖项全部安装到工作空间中,您看本文是正确选择。本文将解释如何使用 rosdep 管理外部依赖项。 二、介绍rosdep 2.1 rosdep是何物? rosdep 是 ROS 的依赖管理实用程序,可以与 ROS 包和外部库…...