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

【C++】继承----下篇

文章目录

  • 前言
  • 一、实现一个不能继承的类
  • 二、友元与继承
  • 三、继承与静态成员
  • 四、多继承以及菱形继承问题
    • 1.继承模型:
    • 2.菱形继承的问题
    • 3.虚拟继承解决数据冗余和二义性的原理
    • 4.虚拟继承的原理
  • 五、继承的总结和反思
    • 1.继承和组合
  • 总结


前言

各位好呀!今天呢我们接着讲继承的相关知识,之前给大家已经分享了继承一部分知识。那今天小编就来给继承收个尾吧。来看看继承的剩下的一部分。
在这里插入图片描述


一、实现一个不能继承的类

想要实现一个不能被继承的类的呢有两种方法:

  1. 方法一:父类的构造函数私有,子类的构造必须调用父类的构造函数,但是父类的构造函数私有化以后呢,在子类中是不可见也不可调用的。那么 子类就无法实例化出对象,这样就可以达到父类不能被继承(C++98的方法)。
  2. 方法二:C++11新增了一个关键字final,用final修饰父类,那么子类就无法继承父类了
#include<iostream>
#include<string>
using namespace std;
class Person//C++11
{
public:
protected:string _name; 
private:Person()//私有化构造函数{}
};
class student:public Person  
{
public:
private:string ID;
};
int main()
{student s;//这里会报错的,因为构造函数已经被私有化,子类是调不到父类的构造函数的//但是这里要注意的是:如果我们这里不定义,代码是不会报错的。return 0;
}#include<iostream>
#include<string>
using namespace std;
class Person final//C++11
{
public:Person()//私有化构造函数 {} 
protected:string _name; 
private:};
class student:public Person  //像这样用final修饰父类的话,父类也不能被子类继承 
{
public:
private:string ID;
};
int main()
{student s;return 0;
}

二、友元与继承

注意:友元关系不能被继承,也就是说,父类的友元不能访问子类的私有成员和保护成员。

解决方法在子类中加上友元就可以了。还有就是要注意一下需要前置声明一下子类

#include<iostream>
#include<string>
using namespace std;
class student;  //前置声明
class Person
{friend void  Print(const Person& p, const student& s); //编译器在遇到一个变量和函数的时候,都只会向上查找(提高查找的效率),// 所以这里的student就会向上查找,但是上面没有student,student在下面//还有就是student不能放在方面取,因为student要继承Person。这两者相互依赖。//为了解决这个问题呢我们会在上面加一个前置声明
public:
protected:string _name="帅哥"; 
};
class student:public Person 
{friend void  Print(const Person& p, const student& s); //由于继承关系不能被继承下来,所以就访问不到student中_num成员变量//解决这个问只需要像这样,加一个友元就可以解决这个问题了。
public:
protected :string _num="123456";
};
void Print(const Person& p, const student& s)
{cout << p._name << endl;  cout << s._num << endl; 
}
int main()
{student v;Person  c;Print(c,v);    return 0;
}

三、继承与静态成员

#include<iostream>
#include<string>
using namespace std; 
class Person
{
public:string _name; static int n;       
}; 
int Person::n = 1; 
class student :public Person
{
public:string  _num;
};
int main()
{Person p;student s;//非静态成员变量的地址 cout << &p._name << endl;cout << &s._name << endl; cout << endl; //静态成员变量的地址cout << &p.n  << endl;cout << &s.n << endl; return 0;
}

在这里插入图片描述

我们通过看到非静态成员_name地址是不一样,这说明了子类继承下来的成员在子类和父类中各有一份。但是静态成员是不是地址相同呀?这又说明父类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。
还有一个就是在共有的情况下,父类和子类指定作用域就可以访问静态成员。这里突破作用域就可以访问,因为它没有存在对象里面,而是存在静态区,它只是受到类域的限制而已。还有就可以把静态成员理解成全局的。

四、多继承以及菱形继承问题

1.继承模型:

继承模型呢分为三种:单继承,多继承和菱形继承

  1. 单继承一个子类只有一个直接父类时称这种继承关系为单继承
    在这里插入图片描述
  2. 多继承一个子类有两个或以上直接父类时称这个继承关系为多继承
    在这里插入图片描述
  3. 菱形继承菱形继承属于一个特殊的多继承

在这里插入图片描述

2.菱形继承的问题

菱形继承主要时两个问题,分别是 二义性和数据冗余

二义性
首先,什么是二义性?二义性就是在访问数据的时候发生歧义,不知道访问那个。

示例:

#include<iostream>
#include<string>
using namespace std; 
class A
{
public:string _name;int _age;
};
class B:public A 
{
public:
protected:string  _number;
};
class C :public A
{
public:
protected:string Gender;  
};
class D :public B, public C
{
public:
protected:string ID;
};
int main()
{D d;d._name;//存在二义性 
}

在这里插入图片描述
问题分析
这里为什么会存在访问不明确呢?结合之前的知识,子类继承父类成员,那么子类和父类中是不是都分别有一份独立的成员。但是现在B和C这两个类都继承了A,然而D又继承B和C。也就是说A,B,C,D中分别都有一份_name,现在要访问父类中的成员_name,但是这里的D是继承了两个类,两个类中都有_name ,所以这里编译器就不知道该访问那个类里面的_name这就是二义性。

解决方法:
怎样解决这个问题呢?其实很简单,只需要显示指定访问那个父类中_name就可以解决问题,但是不能解决数据冗余的问题

#include<iostream>
#include<string>
using namespace std; 
class A
{
public:string _name;int _age;
};
class B:public A 
{
public:
protected:string  _number;
};
class C :public A
{
public:
protected:string Gender;  
};
class D :public B, public C
{
public:
protected:string ID;
};
int main()
{D d;d.B::_name="张三";//指定要访问的父类d.C::_name = "小张"; //指定要访问的父类
}

数据冗余:
数据冗余可以理解成数据重复造成空间的浪费

示例:
菱形继承还有个特别烦的点就是他会让空间变大,一个它的父类在被几个类继承时,那它就有几份。比如下列代码中,A在B,C中各有一份。

#include<iostream>
#include<string>
using namespace std; 
class A
{
public:string _name; int _age; 
};
class B:public A 
{
public:
protected:string  _number;
};
class C :public A
{
public:
protected: string Gender;  
};
class D :public B, public C
{
public:
protected:string ID;
};
class F:public A,public B
{
public:};
int main()
{D d;F f;cout << sizeof(d) << endl;//菱形继承大小cout << sizeof(f) << endl;//多继承的大小
}

在这里插入图片描述
可以看出两者的空间大小相差的将近一倍了。所以,一般不建议创建菱形继承,因为这样有太多的问题,有时候还把握不住,建议不使用。

3.虚拟继承解决数据冗余和二义性的原理

菱形继承一般不建议使用,但是如果非要使用,那该怎样解决二义性和数据冗余呢?这里就要引用一个新的关键字 virtual(虚拟继承)

那这个关键字该怎么用呢?该加在哪里呢?先看示例:

#include<iostream>
#include<string>
using namespace std;
class A
{
public:string _name;int _age;
};
class B :virtual public A
{
public:
protected:string  _number;
};
class C :virtual public A
{
public:
protected:string Gender;
};
class D :public B, public C
{
public:
protected:string ID;
};
int main()
{D d;d._name = "张三";return 0;
}

通过上面的代码可以看出:
virtual应该加在产生二义性和数据冗余继承的地方,现在A是不是产生了二义性和数据冗余 ,那virtual就加在B和C继承的哪里。这样就解决了二义性和数据冗余的问题,这点我们可以通过监视窗口可以看出。
在这里插入图片描述
从监视窗口展示的原因,这里虽然看起来是三份,但其实是一份。这样是不是就解决了数据冗余和二义性的问题啊。
注意:这里的virtual不能只加在B或者C,必须要同时加在B和C

在这里插入图片描述
大家看看这上图,图中的关系是不是菱形继承呢?其实 上图也时菱形继承哦,大家不要对形状太刻板了哦,认为菱形继承那他的形状就必须时菱形。形状不是菱形但是有二义性和数据冗余的产生那他就是菱形继承,

思考以及解决方法
那这里的virtual该加在哪里呢?BC?还是DC?其实正确是应该是加在BC,这里是不是A产生二义性和数据冗余,那就要加BC呀!那这里可以不可以在BCD都加上virtual呢?这里就好比一个人只需要两根拐棍,而你偏要给他三根是一样的性质。在D那里都没有产生二义性和数据冗余那就没必要加。
在这里插入图片描述
还有就是大家在写代码的时候遇到上图这种继承的时候都加上virtual,这种情况呢属于过度防范了。首先我们可以先看看B和C有没有被同一个类继承。如果没有,可以先不用加;如果有,那再加上virtual是不是也不迟啊?所以大家在写代码的时候不要过度的防范二义性和数据冗余。

4.虚拟继承的原理

#include<iostream>
#include<string>
using namespace std;
class A
{
public:A(const char*name,int age=18):_name(name),_age(age) {}string _name;int _age;
};
class B :virtual public A
{
public:B(const char*name,const char*number="1234567899"):A(name),_number(number) {}
protected:string  _number;
};
class C :virtual public A
{
public:C(const char* name, const char* gender="男"):A(name), Gender(gender) {}
protected:string Gender;
};
class D :public B, public C 
{
public:D(const char*name,const char*id="1263457"):B(name) ,C(name) //,A(naem)//这里必须显示调用,不然会报错,//还有就是这里初始化怎么多name,那到底以谁的为准呢?,ID(id) {}
protected:string ID;
};
int main()
{D d("张三"); return 0;
}

在这里插入图片描述
这里从我们之前学的知识来看这里代码的逻辑应该时没有 问题的呀。调用子类的构造函数先调用父类的默认构造函数嘛。但是这里说class A 不存在默认构造。那是怎么回事呢?这不得不就要看看虚拟继承的原理了。
在这里插入图片描述
在这里插入图片描述

相比于普通的多继承,虚拟继承呢是要把class A拿出来放在最底下的一个类中。他就不像普通多继承那样class A分别存在class B 和class C中。因为他要解决二义性和数据冗余。与此同时,这里还要引入一个虚基表和虚基表指针,复杂的很,所以小编这里就没有展示出来。小编这里主要是像让大家看看这两种继承的有什么不同。回到上面的问题:由于这里A不在B和C里面了,而是一个单独的父类,所以A也因该显示调用。

总结:不要轻易使用菱形继承和写出菱形继承的代码,多继承可以用

五、继承的总结和反思

1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。

  1. 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。

1.继承和组合

  1. public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。
  2. 组合是一种has-a的关系,。假设B组合了A,每个B对象中都有一个A对象。
    示例:我们以实现一个简单的栈来演示:
//stack和cin构成has-a的关系
#include<iostream>
#include<string>
#include<stdbool.h> 
using namespace std;
class stack
{
public :void push(const int& x){cin.push_back(x);}void pop(){cin.pop_back();}const int& top()const {return cin.back();}bool empty(){return cin.empty();}
private:  vector<int >  cin; 
};
int main()
{stack s;s.push(1);s.push(2);s.push(3);while (!s.empty()){cout << s.top() << " ";s.pop();}return 0;
}//stack和vector是is-a关系
#include<iostream>
#include<stdbool.h> 
#include<vector>
using namespace std;
class stack:public std::vector<int>  
{
public:void push(const int& x){vector<int> ::push_back(x);}void pop(){vector<int> ::pop_back();}const int& top()const{return vector<int> ::back();}bool empty(){return vector<int> ::empty(); }
};
int main()
{stack s; s.push(1); s.push(2);s.push(3); while (!s.empty()) {cout << s.top() << " "; s.pop();}return 0;
}
  1. 优先使用对象组合,而不是类继承 。
  2. 继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。
  3. 对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse),因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。组合类之间没有很强的依赖关系,耦合度低。优先使用对象组合有助于你保持每个类被封装
  4. 实际尽量多去用组合。组合的耦合度低,代码维护性好。不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用继承,可以用组合,就用组合。

总结

到这里继承的相关知识小编就基本分享完了咯,如果有什么疑问欢迎大家讨论。那今天就到这里吧。
在这里插入图片描述

相关文章:

【C++】继承----下篇

文章目录 前言一、实现一个不能继承的类二、友元与继承三、继承与静态成员四、多继承以及菱形继承问题1.继承模型&#xff1a;2.菱形继承的问题3.虚拟继承解决数据冗余和二义性的原理4.虚拟继承的原理 五、继承的总结和反思1.继承和组合 总结 前言 各位好呀!今天呢我们接着讲继…...

windows安装jax和jaxlib的教程(cuda)成功安装

本文你将解决3个问题&#xff1a;1、jaxlib没有安装的问题&#xff1b;2、python3.9以上&#xff08;不可忽略&#xff09;、cuda12.1&#xff08;可忽略&#xff09;以上配置要求不满足的问题&#xff1b;3、numpy版本太高的问题。 1、问题描述 当你直接pip install jax或者c…...

软考【网络工程师】2023年5月上午题答案解析

1、固态硬盘的存储介质是()。 A 光盘 B 闪存 C 软盘 D 磁盘 答案是 B。 固态硬盘(Solid State Drive),简称 SSD,是用固态电子存储芯片阵列制成的硬盘,其存储介质是闪存(Flash Memory)。闪存具有非易失性,即在断电后仍能保留存储的数据,且读写速度快、抗震性强、能…...

支付场景下,乐观锁的实现(简洁版)

1、问题描述 看到一个同事建的数据库表&#xff0c;好奇打开看看。 create table db_paycenter.t_pay_order_divide (id bigint auto_increment comment 主键id|20250402|XXXprimary key,user_id bigint not null comment user…...

AI视频技术赋能幼儿园安全——教师离岗报警系统的智慧守护

教师离岗报警系统如一位无形的守护者&#xff0c;实时监测教室动态&#xff0c;一旦发现教师离岗超30秒&#xff0c;立即通知园方&#xff0c;确保幼儿不被忽视。这套开源系统以高效检测和即时报警为核心&#xff0c;助力园所优化管理&#xff0c;增强家长信心&#xff0c;开启…...

SCI论文结构笔记

摘要五要素(Abstract)&#xff1a; 背景和研究问题研究目的研究方法研究结果结论和意义 引言&#xff08;Introduction)&#xff1a; 研究背景研究问题研究现状现有的研究的问题与不足本研究的研究目标文章结构 研究综述(Literature review): 选题的理由现存文献中可借鉴的…...

《修仙家族模拟器2》:游戏背景故事介绍!

《修仙家族模拟器2》构建了一个以修仙文明为根基的宗族传承世界&#xff0c;玩家将扮演家族初代掌舵者&#xff0c;在动态演变的修仙江湖中完成从凡俗世家到仙道巨擘的蜕变。以下为具体背景设定解析&#xff1a; 一、世界观架构&#xff1a;仙凡交织的修真宇宙 空间维度 游戏…...

Linux部署ragflow,从安装docker开始~

安装docker https://download.docker.com/linux/static/stable/x86_64/docker-28.0.1.tgz #首先创建一个文件夹&#xff0c;存放我们需要的各类文件,并切换到该目录 mkdir /project && cd /project #此时我们的工作目录已经切换到刚刚创建的文件夹下了&#xff0c;接…...

苹果iosApp提交审核常见问题--内购订阅篇

常见问题1- 准则2.1.1 Guideline 2.1 - Information Needed The app binary includes the PassKit framework for implementing Apple Pay, but we were unable to verify any integration of Apple Pay within the app. Next Steps If the app integrates the functionali…...

从代码学习深度学习 - 微调 PyTorch 版

文章目录 前言一、迁移学习与微调概念二、微调步骤解析三、实战案例:热狗识别3.1 数据集准备3.2 图像增强处理3.3 加载预训练模型3.4 模型重构3.5 差异化学习率训练3.6 对比实验分析总结前言 深度学习模型训练通常需要大量数据,但在实际应用中,我们往往难以获得足够的标记数…...

Registry镜像仓库的安装与使用

任务目标 &#xff08;1&#xff09;了解目前主流的镜像仓库 &#xff08;2&#xff09;掌握registry私有镜像仓库的部署与使用 任务实施 基础信息 Docker私有仓库个宿主机配置信息 主机名 IP地址 节点角色 registry 192.168.110.80 私有仓库 node1 192.168.110.9…...

java多线程(6.0)

目录 ​编辑 阻塞队列 阻塞队列概念 生产者消费者模型 阻塞队列的作用 阻塞队列的使用 阻塞队列的实现 阻塞队列 阻塞队列概念 阻塞队列是一种特殊的队列&#xff0c;同样遵循“先进先出”的原则&#xff0c;支持入队操作和出队操作和一些基础方法。在此基础上&#…...

tkinter的文件对话框:filedialog

诸神缄默不语-个人技术博文与视频目录 文章目录 一、前言二、tkinter.filedialog模块详解2.1 模块导入方式2.2 通用参数说明 三、五大核心函数实战3.1 选择单个文件 - askopenfilename()3.2 多文件选择 - askopenfilenames()3.3 保存文件对话框 - asksaveasfilename()3.4 选择目…...

HOW - 如何模拟实现 gpt 展示答案的交互效果

文章目录 产品设计维度核心目标实现方式主要靠一些技巧1. 用 emoji 做语义锚点2. 每个段落只传达一件事3. 有节奏地对话式切换4. 使用 Markdown 风格来排版5. 用“你”而不是“用户”说话 如果想实现类似体验&#xff08;比如写文档、教程、产品介绍&#xff09; 前端开发维度想…...

达梦数据库压力测试报错超出全局hash join空间,适当增加HJ_BUF_GLOBAL_SIZE解决

1.名词解释&#xff1a;达梦数据库中的HJ_BUF_GLOBAL_SIZE是所有哈希连接操作可用的最大哈希缓冲区大小&#xff0c;单位为兆字节&#xff08;MB&#xff09; 2.达梦压测报错&#xff1a; 3.找到达梦数据库安装文件 4.压力测试脚本 import http.client import multiprocessi…...

第11章 面向分类任务的表示模型微调

​​​​​​第1章 对大型语言模型的介绍第2章 分词和嵌入第3章 解析大型语言模型的内部机制第4章 文本分类第5章 文本聚类与主题建模第6章 提示工程第7章 高级文本生成技术与工具第8章 语义搜索与检索增强生成第9章 多模态大语言模型第10章 构建文本嵌入模型第12章 微调生成模…...

c#加密证件号的中间部分,改为*号

前言 使用场景&#xff1a;在我项目中&#xff0c;我需要给前端提供接口&#xff0c;所以我要吧证件号进行加密。例如&#xff1a;411421199510225612&#xff0c;这是一个身份证号&#xff0c;18为的&#xff0c;那么我加密完成之后就会是 411421********5612&#xff0c;类似…...

qt中写一个简易的计算器

以下是添加了详细代码注释的版本&#xff1a; cpp #include <iostream>using namespace std;定义加法函数&#xff08;已注释掉&#xff09; //int add(int a, int b) { // return a b; //}定义减法函数&#xff08;已注释掉&#xff09; //int min(int a, int b) {…...

[特殊字符] Docker 从入门到实战:全流程教程 + 项目部署指南(含镜像加速)

Docker 是现代 DevOps 的基石&#xff0c;应用广泛于微服务、CI/CD、K8s、云原生等场景。本文将从 0 到 1 手把手带你掌握 Docker 的核心知识点&#xff0c;并完成 Java Nginx 项目部署&#xff0c;适合新手与进阶开发者阅读与实战。 &#x1f4da; 目录 Docker 快速入门 入门…...

《R语言SCI期刊论文绘图专题计划》大纲

今天开始&#xff0c;我将和大家分享系统且详细的《R语言SCI期刊绘图专题教程》&#xff0c;内容会从基础到高阶应用&#xff0c;从配色美学到顶刊风格复现&#xff0c;确保大家可以学到高质量内容&#xff01;下面是大纲。 &#x1f4da;《R语言SCI期刊论文绘图专题计划》 第…...

从氛围到节奏:情绪化配乐网站指南

在影视、短视频、广告甚至游戏开发中&#xff0c;配乐的作用早已超越了简单的背景音效&#xff0c;它能够深刻地影响观众的情绪&#xff0c;为作品注入灵魂。但如何找到那些能够精准传达情绪、完美契合画面的配乐呢&#xff1f;今天&#xff0c;就让我们一起探索那些能够助力你…...

矩阵运营:抢占市场与流量的利器

还在为无法超越行业老大而苦恼&#xff1f;还在为市场份额难以扩大而焦虑&#xff1f;还在为流量匮乏、客资不足而发愁&#xff1f;别担心&#xff0c;矩阵运营就是你突破困局的关键&#xff01; 一、矩阵运营&#xff1a;颠覆传统的运营模式 在当今竞争激烈的商业环境中&…...

【2025最新面试操作系统八股】CPU利用率和load(负载)的区别,CPU利用率怎么算。

总结 负载&#xff08;Load&#xff09;和 CPU 利用率是衡量系统性能的两个不同的指标&#xff0c;它们从不同的角度反映了系统的状态。 CPU 利用率表示 CPU 正在执行指令的时间比例&#xff0c;即 CPU 忙碌的程度。它是一个百分比值&#xff0c;表示在某个时间间隔内&#x…...

ApplicationRunner的run方法与@PostConstruct注解

ApplicationRunner 的 run 方法与 PostConstruct 注解在 Spring Boot 中均用于初始化逻辑&#xff0c;但二者的 执行时机、作用范围 和 功能特性 存在显著差异。以下是详细对比分析&#xff1a; 一、核心差异对比 维度PostConstructApplicationRunner.run()触发时机Bean 实例化…...

【leetcode刷题日记】lc.73-矩阵置零

目录 1.题目 2.代码 1.题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]…...

配置 RDP 远程桌面协议连接ubuntu服务器桌面

文章目录 一、简介二、服务安装三、桌面安装小结 一、简介 RDP&#xff08;Remote Desktop Protocol&#xff0c;远程桌面协议&#xff09;是微软开发的一种专有协议&#xff0c;用于在网络上实现远程桌面访问&#xff0c;允许用户通过客户端设备&#xff08;如 Windows、Linu…...

统计文件中单词出现的次数并累计

# 统计单词出现次数 fileopen("E:\Dasktape/python_test.txt","r",encoding"UTF-8") f1file.read() # 读取文件 countf1.count("is") # 统计文件中is 单词出现的次数 print(f"此文件中单词is出现了{count}次")# 2.判断单词出…...

【初识Trae】字节跳动推出的下一代AI原生IDE,重新定义智能编程

​ 初识官网文档 从官网可以看到有两个大标签页&#xff0c;即Trae IDE CN和Trae插件&#xff0c;这就说明Trae在发布Trae IDE的同时考虑到对主流IDE的插件支持&#xff0c;这一点非常有心&#xff0c;但是我估测Trae IDE的体验更好&#xff08;就是AI IDE出生&#xff0c;毕…...

Spark读取Apollo配置

--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…...

前端技术Ajax实战

1.1 案例_图书管理-介绍 目标 掌握图书管理案例的增删改查业务和 Bootstrap 弹框的使用。 讲解 1. 运行图书管理案例效果 展示增删改查业务效果&#xff0c;并使用 Bootstrap 弹框承载表单。 2. 分析步骤 学习 Bootstrap 弹框&#xff08;用于添加和编辑图书&#xff09…...

ctfshow web入门 命令执行(29-77)

Web 命令执行是指攻击者借助Web应用程序里的漏洞&#xff0c;在服务器端执行任意系统命令的一种攻击手段。 原理&#xff1a; Web 应用程序在处理用户输入时&#xff0c;有时会调用系统命令。若开发人员没有对用户输入进行严格的过滤与验证&#xff0c;攻击者就能够通过构造恶意…...

Mac「brew」快速安装Redis

安装Redis 步骤 1&#xff1a;安装 Redis 打开终端&#xff08;Terminal&#xff09;。 运行以下命令安装 Redis&#xff1a; brew install redis步骤 2&#xff1a;启动 Redis 安装完成后&#xff0c;可以使用以下命令启动 Redis 服务&#xff1a; brew services start redis…...

非对称电容减重实验

加载高压的非对称电容在变压器油中的减重实验 早年国外流传飘升机&#xff08;Lifter&#xff09;的视频。爱好者们用简单的材料制作了非对称电容&#xff0c;通高压直流电&#xff0c;它就能飘起来。 所谓的飘升机&#xff0c;就是一种非对称电容。它由面积相差极大的两个极板…...

day37图像处理OpenCV

文章目录 一、图像预处理19 霍夫变换19.1 理解霍夫变换19.2 (标准)霍夫直线变换19.3 统计概率霍夫直线变换19.4 霍夫圆变换 一、图像预处理 19 霍夫变换 19.1 理解霍夫变换 霍夫变换是图像处理的一种技术&#xff0c;主要用于检测图像中的直线、圆等几何形状。基本思想就是将…...

23种设计模式-行为型模式之责任链模式(Java版本)

Java 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;详解 &#x1f9e0; 什么是责任链模式&#xff1f; 责任链模式是一种行为型设计模式&#xff0c;它使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者与接收者之间的耦合关系。将这些对象…...

机器学习的基本概念

机器学习是人工智能的一个重要研究领域。与计算机科学、心理学等多种学科都有密切的关系&#xff0c;牵涉的面比较宽&#xff0c;而且许多理论及技术上的问题尚处于研究之中&#xff0c;接下来对它的一些基本概念和方法作一简要讨论&#xff0c;以便对它有一个初步的认识。 一…...

【6】GD32 高级通信外设 CAN、USBD

高级通信外设&#xff1a;CAN、USBD CAN CAN简介、主要功能与相关API回环模式收发发送特定ID的数据帧实验CAN数据帧的接收实验使用过滤器接收特定的数据帧 USBD USB通信简介USBD设备固件库架构、分层文件与库函数说明USBD模拟键盘应用USBD虚拟串口应用USBD模拟U盘应用...

手工收集统计信息

有时想对某些表收集统计信息 CREATE OR REPLACE PROCEDURE GATHER_STATS ASDECLAREV_SQL1 VARCHAR(1000);--表游标CURSOR C1 ISSELECT (SELECT USER) AS TABLE_OWNER,TABLE_NAMEFROM USER_TABLES; --可以在这里加过滤条件--索引游标CURSOR C2 ISSELECT TABLE_OWNER,INDEX_NAM…...

隧道调频广播覆盖的实现路径:隧道无线广播技术赋能行车安全升级,隧道汽车广播收音系统助力隧道安全管理升级

隧道调频广播覆盖的实现路径:隧道无线广播技术赋能行车安全升级,隧道汽车广播收音系统助力隧道安全管理升级 北京海特伟业科技有限公司任洪卓发布于2025年4月23日 在现代交通基础设施建设中&#xff0c;隧道作为公路、铁路等交通网络的重要组成部分&#xff0c;其内部通信系统…...

深度强化学习(DRL)实战:从AlphaGo到自动驾驶

——从算法原理到产业落地的全链路解析 摘要 本文通过算法对比矩阵、训练流程图解、Python代码实战及产业应用解析&#xff0c;构建从理论创新到工程落地的完整技术栈。实验数据显示&#xff1a;采用PPO算法训练的7自由度机械臂抓取成功率达92%&#xff0c;基于改进型DQN的自…...

【数据可视化-33】病毒式社交媒体潮流与用户参与度可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

ubuntu使用dify源码安装部署教程+避坑指南

很多人,包括我在最初使用dify的时候都习惯使用docker来部署安装环境,但在二次开发使用过程中,我们可能希望使用源码来安装,那么这篇文章我将给大家分享如何在ubuntu系统下使用源码安装,并提供大家遇到的疑难杂症如下: dify安装使用过程中报错:/console/api/workspaces/…...

软件技术专业

软件技术专业是一个专注于软件开发、测试、维护及相关技术的学科专业。以下是其相关介绍&#xff1a; 专业概述 软件技术专业主要培养具备扎实的软件理论基础和较强的实践能力&#xff0c;能熟练掌握软件开发工具和技术&#xff0c;从事软件设计、开发、测试、维护等工作的高素…...

AI数据分析的利器:解锁BI工具的无限潜力

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业最宝贵的资产之一。如何高效、准确地分析这些数据&#xff0c;挖掘其中的价值&#xff0c;成为企业决策的关键。AI数据分析&#xff0c;作为新时代的数据分析利器&#xff0c;正逐渐改变着企业的决策方式。而BI&#xff0…...

docker 代理配置冲突问题

问题描述 执行 systemctl show --property=Environment docker 命令看到有如下代理配置 sudo systemctl show --property=Environment docker Environment=HTTP_PROXY=http://127.0.0.1:65001 HTTPS_PROXY=http://127.0.0.1:65001 NO_PROXY=127.0.0.1,docker.io,ghcr.io,uhub…...

清理HiNas(海纳斯) Docker日志并限制日志大小

我在一个机顶盒的HiNas系统上跑Octoprint的docker版本&#xff0c;每隔一段时间盒子空间就被占完了&#xff0c;运行df -h之后&#xff0c;显示/dev/root Use 100%。 Filesystem Size Used Avail Use% Mounted on /dev/root 6.6G 6.6G 0 100% / devtmpfs …...

kafka整合flume与DStream转换

一、Kafka整合flume cd /opt/software/flume/conf/ vi flume-kafka.conf a1.sourcesr1 a1.sinksk1 a1.channelsc1 a1.sources.r1.typespooldirt a1.sources.r1.spoolDir/root/flume-kafka a1.sinks.k1.typeorg.apache.flume.sink.kafka.KafkaSink a1.sinks.k1.kafka.to…...

第2讲:R语言中的色彩美学——科研图表配色指南

目录 一、背景导引:科研图表为何需要“配色讲究”? 二、色彩基础认知:别让“红绿盲”错过你的科研成果 三、R语言中的配色库全景图 四、案例演示与代码实战 🎨案例1:ggplot2 + viridis 配色的热图 🎨案例2:MetBrewer 中的印象派色彩 五、技巧点拨:如何为SCI图…...

C++入门小馆: 深入了解STLlist

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

Float32、Float16、BFloat16

我们先介绍 Float32、Float16、BFloat16 的 浮点数表示方法 然后根据浮点数表示&#xff0c;来分析总结他们是怎么控制 精度和 数值范围 的 最后再来对比的说明 Float32、Float16、BFloat16 的 应用场景 和 硬件支持 1、浮点数的表示方法 Float32 &#xff1a; 单精度浮点数…...