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

C++进阶-多态

文章目录

  • C++进阶--多态
    • 概念
    • 多态的定义及实现
      • 多态的构成条件
      • 实现多态的两个重要条件
      • 虚函数
      • 虚函数的重写及覆盖
      • 协变
      • 析构函数的重写(面试被问及最好需要举例说明)
      • override和final关键字
      • 重载,重写(覆盖),隐藏(重定义)的比较(要记忆)
    • 纯虚函数和抽象类
    • 多态的原理
      • 虚函数表指针
      • 多态的原理
        • 多态是如何实现的
        • 动态绑定与静态绑定
        • 虚函数表
    • 结语:

我们今天又见面啦,给生活加点impetus!!开启今天的编程之路!!
在这里插入图片描述
我们来完成面向对象的最后一部分–多态
作者:٩( ‘ω’ )و260
我的专栏:C++进阶,c++初阶,数据结构初阶,题海探骊,c语言
欢迎点赞,关注!!

C++进阶–多态

概念

多态,就是多种形态,分为静态多态(编译时多态)和动态多态(运行时多态)静态多态主要是函数模版和函数重载,他们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态。
之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时⼀般归为静态,运行时归为动态
动态多态:具体点就是去完成某个行为(函数),可以传不同的对象就会完成不同的行为,就达到多种形态

多态的定义及实现

多态的构成条件

多态是一个继承关系的下的类对象,去调用同一函数,产⽣了不同的行为

实现多态的两个重要条件

1:必须是基类的指针或者引用去调用虚函数
:2:被调用的函数必须是虚函数,并且完成了虚函数的重写和覆盖(必须满足三同,即返回类型,函数名,参数的类型和个数,特殊情况协变除外)

注意:要实现多态效果,第⼀必须是基类的指针或引用,因为只有基类的指针或引用才能既指向基类对象又指向派⽣类对象;第二派⽣类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派⽣类之间才能有不同的函数,多态的不同形态效果才能达到。

这里我们来举例查看多态的效果:
在这里插入图片描述
这里可以看到虽然都是Animal的对象在调用talk,但是跟animal没关系,而是由ptr指向的对象决定的
满足上面多态的条件,此时是形成多态调用的。调用同一个函数,产生了不同类型的效果。
再来看一个例子:
在这里插入图片描述

接下来我们来详细介绍:

虚函数

类成员函数前⾯加virtual修饰,那么这个成员函数被称为虚函数。注意非成员函数不能加virtual修饰。(一定要是类的成员函数
如下:

class Animal
{
public:virtual viod talk(){}
}
class cat:public Animal{
pubilc:virtual void talk(){//重写实现的行为}
}

虚函数的重写及覆盖

虚函数的重写/覆盖:派⽣类中有⼀个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称派生类的虚函数重写了基类的虚函数。

细节:重写如何理解呢?
如果构成重写,其实就是基类中虚函数的声明加上重写函数的实现即可。所以,其实virtual可以不用再派生类的重写虚函数中写出,但是在基类中必须要写出virtual,但是一般不要这样写,这样写代码的可视化降低了。
本质:重写基类虚函数时,派生类的虚函数在不加virtual关键字时,也可以构成重写(因为继承后基类的虚函数被继承下来了在派⽣类依旧保持虚函数属性

所以在上面给出的示例代码中,如果你尝试将派生类的virtual去除,其实也是能够得到理想结果的,但是如果去除基类的virtual,就将无法构成多态调用。

协变

前面我们提到了重写的概念,必须要满足三同(返回类型,函数名,参数类型和个数),但是有了协变之后,为了处理某些特殊情况,即使返回类型不同,也能够构成多态,条件是返回类型必须是父类和子类类型的指针或者引用
即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。
来看例子:
在这里插入图片描述
我们再来想一下,必须是本身的基类和派生类的类型呢?可不可以是其他的基类和派生类的类型呢?是可以的,来看代码:
在这里插入图片描述
协变在实践中的意义不大,仅做了解即可。

析构函数的重写(面试被问及最好需要举例说明)

我们平常写析构函数都是构造函数,再来取反得到析构函数,例如:

class A{
public:A(){}~A(){}
};

因为构造函数是固定的,所以析构函数就是固定的,如果我们要来重写虚函数,就无法满足三同中的函数名相同,为了解决这个缺陷,编译器会将析构函数统一转换成destructor(),就能满足函数名相同了

结论:基类的析构函数为虚函数,此时派生类析构函数只要定义(说明此时派生类中定义了资源,需要手动析构资源),无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以基类的析构函数加了vialtual修饰,派生类的析构函数就构成重写

为什么还要来进行析构重写呢?我们来看下面这段代码:

class A
{
public:virtual ~A(){cout << "~A()" << endl;}
};
class B : public A {
public:~B(){cout << "~B()->delete:" << _p << endl;delete _p;}
protected:int* _p = new int[10];
};
// 只有派⽣类Student的析构函数重写了Person的析构函数,下⾯的delete对象调⽤析构函数,才能构成多态,才能保证p1和p2指向的对象正确的调⽤析构函数
int main()
{A* p1 = new A;//基类指针或引用调用虚函数A* p2 = new B;//基类指针或引用调用虚函数delete p1;delete p2;return 0;
}

这里delete一个自定义类型,会转换成p1->~A()+operator delete()(delete自定义类型会调用自定义类型中的析构函数以及free函数)。
我们为什么这里要设置成指针呢?目的是满足多态调用的第一个条件-基类的指针或者引用调用虚函数。而且此时满足虚函数的三同,我们来查看结果:
在这里插入图片描述
此时我们调用了b的析构函数,将b中的new的资源给释放掉了,如果这里我没有写成多态(将基类中析构前面的virtual删除),来看结果:
在这里插入图片描述
此时b中new的资源并没有被删除,造成了内存泄漏。

复习一个知识点:为什么这里顺序是这样的呢?
构造是先基类后派生类,析构是先派生类后基类
上面构成了多态调用,与p1和p2无关,只与后面的对象有关,先析构A对象,后析构B对象,因为B是派生类,析构完B后还会去析构一下基类A,所以顺序是如此

这个知识点:提问一般是为什么基类的析构函数建议设计成虚函数?

override和final关键字

从上面可以看出,C++对虚函数重写的要求比较严格,但是有些情况下由于疏忽,比如函数名写错参数写错等导致无法构成重写,而这种错误在编译期间是不会报出的,只有在程序运行时没有得到预期结果才来debug会得不偿失,因此C++11提供了override,可以帮助用户检测是否重写如果我们不想让派生类重写这个虚函数,那么可以用final去修饰
基类加了final的话就无法被继承了!!
final在基类成员函数定义的最后来加,override在派生类成员函数定义的最后来加,来看示例:
在这里插入图片描述

重载,重写(覆盖),隐藏(重定义)的比较(要记忆)

来比较一下三者(经常考):
在这里插入图片描述
有些时候隐藏也被叫作为重定义。
理解:隐藏和重写有相同的地方,他们可以看作为重写的条件比隐藏更加严格即可

纯虚函数和抽象类

在虚函数的后面写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被派⽣类重写,但是语法上可以实现),只要声明即可。包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象如果派⽣类继承后不重写纯虚函数,那么派⽣类也是抽象类纯虚函数某种程度上强制了派生类重写虚函数,因为不重写实例化不出对象
抽象一般都是在现实生活中无法存在的事物,现实生活中都不存在,就没有必要实例化对象出来了,自然只给声明就好。给定义无意义,因为会被重写的

在虚函数后面写=0是在基类的虚函数后面写这个

class Car
{
public:virtual void Drive() = 0;
};
class Benz :public Car
{
public:virtual void Drive(){cout << "Benz-舒适" << endl;}
};

多态的原理

虚函数表指针

先从一个例题引出:

class Base
{
public:virtual void Func1(){cout << "Func1()" << endl;}
protected:int _b = 1;char _ch = 'x';
};
int main()
{Base b;cout << sizeof(b) << endl;return 0;
}

来看结果:
在这里插入图片描述
为什么是12,而不是8呢?我成员变量不是只有一个int和一个char吗?按照内存对齐规则应该就是8啊。
因为里面还有一个vfptr的指针数组放在对象的前面(注意有些平台可能会放到对象的最后面,这个跟平台有关)
在这里插入图片描述
在32位(x86)环境下指针的大小是4个字节,64位(x64)环境下指针的大小是8个字节。这个指针叫做虚函数表指针(表就代表是数组)。

⼀个含有虚函数的类中都至少都有⼀个虚函数表指针,因为一个类所有虚函数的地址要被放到这个类对象的虚函数表中,虚函数表也简称虚表

多态的原理

多态是如何实现的

从底层的角度UseFun函数中ptr->talk(),是如何作为animal指向Animal对象调用Animal::talk(),animal指向cat对象调用cat::talk的呢?animal指向dog对象调用dog::talk的呢?通过下图我们可以看到,满足多态条件后,底层不再是编译时通过调用对象确定函数的地址,而是运行时到指向的对象的虚表中确定对应的虚函数的地址,这样就实现了指针或引用指向基类就调用基类的虚函数,指向派⽣类就调用派生类对应的虚函数。第一张图,animal指向的Animal对象,调用的是Animal的虚函数;第二张图,ptr指向的dog对象,调用的是dog的虚函数。cat同理。

在这里插入图片描述

动态绑定与静态绑定

对不满足多态条件(指针或者引⽤+调⽤虚函数)的函数调⽤是在编译时绑定,也就是编译时确定调⽤函数的地址,叫做静态绑定。
满足多态条件的函数调⽤是在运⾏时绑定,也就是在运⾏时到指向对象的虚函数表中找到调⽤函数的地址,也就做动态绑定。
我们来看一下静态绑定和动态绑定的反汇编代码:
在这里插入图片描述

虚函数表

结论:
1:基类对象的虚函数表中存放基类所有虚函数的地址。同类型的对象共⽤同⼀张虚表(防止无用的消耗),不同类型的对象各⾃有独⽴的虚表,所以基类和派⽣类有各⾃独⽴的虚表
2:派⽣类由两部分构成,继承下来的基类和⾃⼰的成员,⼀般情况下,继承下来的基类中有虚函数表指针,⾃⼰就不会再⽣成虚函数表指针。但是要注意的这⾥继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派⽣类对象中的基类对象成员也独⽴的(即派生类和基类中的虚函数表vfptr的地址不同)
3:派⽣类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址
4:派⽣类的虚函数表中包含,(1)基类的虚函数地址,(2)派⽣类重写的虚函数地址完成覆盖,派⽣类⾃⼰的虚函数地址三个部分
5:虚函数表本质是⼀个存虚函数指针的指针数组,⼀般情况这个数组最后⾯放了⼀个0x00000000标记。(这个C++并没有进⾏规定,各个编译器⾃⾏定义的,vs系列编译器会再后⾯放个0x00000000标记,g++系列编译不会放)
6:虚函数存在哪的?虚函数和普通函数⼀样的,编译好后是⼀段指令,都是存在代码段的(vs上),只是虚函数的地址⼜存到了虚表中

结语:

感谢大家阅读我的博客,不足之处欢迎留言讨论,感谢大家的支持!!
锲而舍之,朽木不折;锲而不舍,金石可镂,加油!!
在这里插入图片描述

相关文章:

C++进阶-多态

文章目录 C进阶--多态概念多态的定义及实现多态的构成条件实现多态的两个重要条件虚函数虚函数的重写及覆盖协变析构函数的重写&#xff08;面试被问及最好需要举例说明&#xff09;override和final关键字重载&#xff0c;重写&#xff08;覆盖&#xff09;&#xff0c;隐藏&am…...

Linux教程-常用命令系列三

文章目录 1. 网络安全常用命令1. su (Switch User)2. chmod (Change Mode)3. chown (Change Owner)4. ps (Process Status)5. who6. top7. free8. kill9. gedit10. find总结 2. 字符串显示命令2.1 基本语法2.2 常用选项2.3 核心功能与示例2.3.1 输出字符串2.3.2 输出变量2.3.3 …...

GIS开发笔记(9)结合osg及osgEarth实现三维球经纬网格绘制及显隐

一、实现效果 二、实现原理 按照5的间隔分别创建经纬线的节点&#xff0c;挂在到组合节点&#xff0c;组合节点挂接到根节点。可以根据需要设置间隔度数和线宽、线的颜色。 三、参考代码 //创建经纬线的节点 osg::Node *GlobeWidget::createGraticuleGeometry(float interv…...

nuxt3前端开发以及nuxt3和nuxt2项目的详细差异点

以下是 Nuxt 3 前端开发的详细指南以及与 Nuxt 2 的核心差异总结,涵盖配置、开发模式、API 变化等关键方面: 一、Nuxt 3 前端开发核心要点 1. 项目初始化 # Nuxt 3 npx nuxi init <project-name> cd <project-name> npm install npm run dev# Nuxt 2 (对比) np…...

Android学习总结之APK打包流程

一、预处理阶段&#xff08;编译前准备&#xff09; 1. AIDL 文件处理&#xff08;进程间通信基础&#xff09; 流程&#xff1a; 用于实现 Android 系统中不同进程间的通信&#xff08;IPC&#xff09;。在项目构建时&#xff0c;AIDL 编译器会将 .aidl 文件编译为 Java 接口…...

java面试篇(常见的集合底层原理)

集合 1、arraylist源码分析 三种构造方法&#xff1a; 扩容的逻辑&#xff1a; 2、ArrayList的底层实现原理是什么&#xff1f; ArrayList listnew ArrayList(10)中的list扩容几次 3、如何实现数组和List之间的转换 4、LinkedList和arraylist的区别 5、hashmap的实现原理 二叉…...

RAG框架精选2

原文链接:https://i68.ltd/notes/posts/20250406-llm-rag2/ 清华Hyper-RAG 使用超图驱动的RAG对抗LLM幻觉论文链接:https://arxiv.org/pdf/2504.08758项目仓库:https://github.com/iMoonLab/Hyper-RAG清华Hyper-RAG&#xff1a;利用超图建模高阶关系&#xff0c;让DeepSeek/Q…...

Redis进阶学习

什么是Redis&#xff1f; Redis是一个key-value结构的非关系型数据库&#xff0c;将数据存储在内存中&#xff0c;结构简单&#xff08;五种数据结构&#xff1a;string、list、set、zset、hash&#xff09;&#xff0c;数据读写速度快&#xff0c;还可以将数据持久化到硬盘上。…...

【读书笔记·VLSI电路设计方法解密】问题63:为什么可测试性设计对产品的财务成功至关重要

可测试性设计至关重要,因为我们不希望将劣质或故障部件交付给客户。向客户交付过多不良部件意味着财务灾难,更会损害企业声誉并导致商业机会流失。 若设计中未嵌入可测试性设计(DFT),区分良品与不良品的唯一方法就是由应用工程师或客户在实际应用环境中测试芯片。此时芯片…...

Federated Weakly Supervised Video Anomaly Detection with Multimodal Prompt

标题&#xff1a;联邦弱监督视频异常检测的多模态提示方法 原文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/35398 源码链接&#xff1a;https://github.com/wbfwonderful/Fed-WSVAD 发表&#xff1a;AAAI-2025 摘要&#xff08;Abstract&#xff09; …...

计算机视觉与深度学习 | LSTM原理,公式,代码,应用

LSTM(长短期记忆网络)详解 一、原理 LSTM(Long Short-Term Memory)是RNN的改进版本,通过引入门控机制(输入门、遗忘门、输出门)和细胞状态(Cell State),有效解决传统RNN的梯度消失/爆炸问题,擅长捕捉长距离依赖关系。 核心思想: 细胞状态(C_t):贯穿整个时间步…...

UI界面工程,如何使用控制台

我们通常会使用print函数向控制台输出调试信息。但创建UI界面工程时&#xff0c;默认不会显示控制台。 通过如下方法切换到控制台 项目属性—链接器—系统—子系统—窗口改为控制台...

mysql——基础知识

关键字大小写不敏感 查看表结构中的 desc describe 描述 降序中的 desc descend 1. 数据库的操作 1. 创建数据库 create database 数据库名;为防止创建的数据库重复 CREATE DATABASE IF NOT EXISTS 数据库名;手动设置数据库采用的字符集 character set 字符集名;chars…...

UE虚幻4虚幻5动画蓝图调试,触发FellOutOfWorld事件和打印输出,继续DeepSeek输出

找到了一个pdf&#xff0c;本来想写个翻译的&#xff0c;但还是算了&#xff0c;大概看了下&#xff0c;这类文档很全面&#xff0c;内容很多&#xff0c;但都不是我要的&#xff0c;我想要一个动画蓝图&#xff0c;搜索Montage&#xff0c;或者Anim 只占了一行&#xff08;几百…...

52单片机LED实验

文章目录 前言点亮一个LEDLED闪烁 LED灯亮灭交替LED流水灯 前言 我所用的板子是普中的STC89C52RC&#xff0c;创建文件的过程中如果你发现keil文件找不到单片机依赖&#xff0c;那怎么办呢 下面从创建新项目讲起 首先打开keil软件&#xff0c;点击project new一个新的projec…...

【C++详解】C++入门(一)命名空间、缺省参数、函数重载

文章目录 一、命名空间命名空间的基本特性命名空间的使用 二、C输入输出用法三、缺省参数(默认参数)定义用法 四、函数重载 一、命名空间 命名空间的基本特性 #include <stdio.h> #include <stdlib.h>int rand 10;int main() {// 编译报错&#xff1a;error C23…...

AWS Linux快速指南:5分钟搭建多用户图形界面

一、概述 本指南将帮助您在AWS上快速部署一个支持多用户、带图形界面和浏览器的Linux环境。我们将使用Ubuntu Server作为基础,配合轻量级的Xfce桌面环境和VNC服务。同时,我们还将提供不同用户规模下的实例规格推荐。 二、实例规格推荐 根据您的用户规模,我们推荐以下EC2实例…...

kotlin,编码、解码

kotlin写程序确实简洁&#xff0c;就是函数式编程对我这种用惯了过程的&#xff0c;换思想有难度。package org.exampleimport java.io.File import java.io.FileNotFoundExceptionval byteToHanzi mapOf(0x00 to "凡", 0x01 to "周", 0x02 to "张&q…...

从零创建 Docker 镜像(基于 OCI 格式)

更现代的 OCI 镜像格式&#xff0c;采用了 OCI Image Format Specification&#xff0c;其中文件引用使用 blobs/sha256/<hash> 的形式&#xff0c;层和配置存储在 blobs/sha256/ 目录下&#xff0c;并且包含 LayerSources 字段。这种格式在较新的 Docker 版本和 OCI 兼容…...

JavaScript 版本号比较

问题描述&#xff1a; 实现 &#xff1a; <script>const compare function(v1,v2){const arr1 v1.split(.)const arr2 v2.split(.)for(let i 0;i<arr1.length||i<arr2.length;i){const a arr1[i]||0const b arr2[i]||0if(a>b){return 1}else if(a<b){…...

MySQL为什么默认使用RR隔离级别?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL为什么默认使用RR隔离级别?】面试题。希望对大家有帮助&#xff1b; MySQL为什么默认使用RR隔离级别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 默认使用 RR&#xff08;Repeatable Read&#xff09;…...

第37讲|AI+农业气象建模:预测极端天气对农业的影响

目录 ✨ 导语:天气不可控,但影响可以预测 📦 一、数据准备:融合农业与气象 ⚡ 二、极端天气如何“定义”? 🔧 三、模型选择与结构设计 🔁 时间序列模型:LSTM 🎯 非时序模型:XGBoost / LightGBM 🧪 四、案例实战:用LSTM预测小麦产量下降风险(受极端天气…...

(done) 吴恩达版提示词工程 1. 引言 (Base LLM 和 Instruction Tuned LLM)

url: https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 LLM 有两种&#xff1a; 1.基础 LLM&#xff0c;通过文本训练数据预测后面的内容。 这种 LLM 当你给它提问&#xff1a;What is…...

Vue如何实现样式隔离

1. 使用 CSS Modules CSS Modules 允许你在 Vue 组件中定义局部作用域的 CSS&#xff0c;这样可以避免全局样式的冲突 步骤如下&#xff1a; 在你的 Vue 组件中&#xff0c;创建一个 <style> 标签并添加 module 属性。 <template><div :class"$style.c…...

Sentinel源码—6.熔断降级和数据统计的实现二

大纲 1.DegradeSlot实现熔断降级的原理与源码 2.Sentinel数据指标统计的滑动窗口算法 2.Sentinel数据指标统计的滑动窗口算法 (1)滑动窗口介绍 (2)StatisticSlot使用滑动窗口算法进行数据统计 (1)滑动窗口介绍 一.滑动窗口原理 滑动窗口不会指定固定的时间窗口起点与终点…...

B+树删除和测试

B树删除和测试 5.1 高级接口&#xff1a;B 树作为键值存储 在本章中&#xff0c;我们将实现 B 树的高级接口&#xff0c;使其能够作为键值存储&#xff08;Key-Value Store&#xff09;使用。这些接口包括插入和删除操作&#xff0c;并处理根节点的维护。 1. 插入接口 1.1 I…...

常用算法解析:从基础排序到图论应用

一、算法基础与设计原则 算法是计算机解决问题的核心工具&#xff0c;其五大基本特性决定了程序的可靠性&#xff1a; 有穷性&#xff1a;算法必须能在有限步骤内终止确定性&#xff1a;每步操作无歧义可行性&#xff1a;可被计算机执行输入输出&#xff1a;具备数据交互能力…...

Java Web项目(一)

框架 java web项目总工分为两部分&#xff1a;客户端&#xff08;前端&#xff09;和服务端&#xff08;后端&#xff09; 客户端发起请求&#xff0c;服务端接受请求并进行处理 发起请求的方式&#xff1a;from表单、jQuery ajax from表单 造成全局的变化&#xff0c;在发…...

兴达易控DP主站网关数据映射快速配置案例

兴达易控DP主站网关数据映射快速配置案例 在工业自动化的领域&#xff0c;不同通讯协议之间的转换是常见的需求。特别是Profibus DP与Modbus-RTU这两种广泛应用于不同系统和设备的通讯协议&#xff0c;它们之间的数据转换显得尤为重要。本文将详细探讨兴达易控Profibus DP主站…...

Tailwindcss 入门 v4.1

以 react 为例&#xff0c;步骤如下&#xff1a; npm create vitelatest my-app -- --template react 选择 React 和 JavaScript 根据上述命令的输出提示&#xff0c;运行以下命令 cd my-app npm install npm run dev 一个 React App 初始化完成。 安装 Tailwindcss theme …...

通过 WebSocket 接收和播放 WSS 协议视频流

1.创建wss协议视频 1.1必备包 npm install ws ffmpeg-installer/ffmpeg fluent-ffmpeg 说明&#xff1a;安装以下三个包。 1.2代码实现 说明&#xff1a;创建WebSocket服务器&#xff0c;端口为8080 import { WebSocket, WebSocketServer } from ws; // 导入 WebSocket 和 W…...

HTML 如何改变字体颜色?深入解析与实践指南

网页上的字体颜色是网页设计中至关重要的元素之一&#xff0c;它像字体大小一样&#xff0c;对于提升用户体验起着举足轻重的作用。精心选择和运用字体颜色&#xff0c;能够增强页面的可读性、突出重点信息、营造特定的情感氛围&#xff0c;甚至直接影响用户的视觉感受和品牌认…...

tigase源码学习杂记-组件化设计

前言 tigase官方号称高度抽象和组件化。这篇文章就记录一下我研究组件化的相关设计 概述 我的理解tigase高度组件化是所有的关键的功能的类&#xff0c;它都称之为组件&#xff0c;即只要继承于BasicComponent&#xff0c;它都可以成为组件&#xff0c;BasicComponent类实现…...

十二、人工神经网络及其应用

写在前面 这部分内容老师说很重要,不管是实验还是考试占比都非常大 AIGC的全称是“Artificial Intelligence Generated Content”,即人工智能生成内容。这一术语通常用于指代通过人工智能技术自动生成的各种类型的内容,如文本、图像、音频和视频等。随着AI技术的发展,AIG…...

vscode使用技巧

一、符号定位技巧 ‌跳转到定义‌ F12 或右键「Go to Definition」跳转到符号定义位置‌CtrlClick 直接点击符号跳转&#xff08;支持变量/函数/类&#xff09; ‌符号大纲视图‌ CtrlShiftO 打开文件符号大纲&#xff0c;支持模糊搜索符号名‌输入: 分类显示符号&#xff08;…...

测试基础笔记第七天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、cat命令二、ls -al命令三、>重定向符号四、>>追加重定向符号五、less/more命令六、grep命令七、|管道符八、clear命令九、head命令十、tail命令十一、…...

FOC控制中的正弦PWM和空间矢量PWM对比与理解

参考&#xff1a; simple foc&#xff1a;https://docs.simplefoc.com/docs_chinese/foc_theory博客&#xff1a;https://blog.csdn.net/qq_43332314/article/details/126449398 一、无刷电机基础原理 1.&#xff0c; 原理图&#xff1a;至少三个绕组线圈&#xff08;定子&…...

【Oracle专栏】函数中SQL拼接参数 报错处理

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 最近同事反馈了一个很奇怪的问题,即有一个函数,入参是当前年月,主要作用是通过SQL语句将不合规的数据插入到指定表中,插入数据时带上入参的年月参数。当前问题:单独测试SQL没有问题可以执行成功,…...

无意间发现的宝藏项目:开源世界中的演示项目精选合集

&#x1f31f;无意间发现的宝藏项目&#xff1a;开源世界中的演示项目精选合集 最近在 GitHub 上随手翻了翻 Spring 官方代码仓库&#xff0c;意外发现一个超有趣的演示项目 —— spring-petclinic。一个轻量但结构完整的 Spring 全家桶演示&#xff0c;让人忍不住一探究竟。 这…...

OpenCSG AutoHub v0.5.0 版本发布

OpenCSG AutoHub v0.5.0 版本发布 作为一款智能化自动化操作的浏览器插件&#xff0c;AutoHub不断致力于为用户提供更加高效、便捷的网页浏览体验。本次 v0.5.0版本 的发布&#xff0c;不仅进一步强化了核心功能&#xff0c;还引入了一些创新特性&#xff0c;旨在帮助用户更智…...

基于Python智能体API的Word自动化排版系统:从零构建全流程模块化工作流与版本控制研究

基于Python智能体API的Word自动化排版系统:从零构建全流程模块化工作流与版本控制实践研究 1. 引言2. 研究背景与意义3. 自动排版工作流的设计原理3.1 文档内容提取与解析3.2 样式参数与格式化规则3.3 智能体API接口调用3.4 自动生成与批量处理3.5 与生成式AI的协同4. 系统架构…...

在 Node.js 中设置响应的 MIME 类型

在 Node.js 中设置响应的 MIME 类型是为了让浏览器正确解析服务器返回的内容&#xff0c;比如 HTML、CSS、图片、JSON 等。我们通常通过设置响应头中的 Content-Type 字段来完成。 ✅ 一、什么是 MIME 类型&#xff08;Content-Type&#xff09;&#xff1f; MIME&#xff08;…...

jsch(shell终端Java版)

学习笔记 Java SSH库使用简介&#xff1a;Apache sshd和JSch&#xff08;Java Secure Channel&#xff09; github - fork of the popular jsch library JSch学习笔记 web-shell - gitee代码 - 纯Java实现一个web shell登录Linux远程主机&#xff0c;技术选型 SpringBoot …...

Redis分布式锁RedLock机制详解

一、RedLock机制解决的问题 核心场景&#xff1a;解决传统Redis单节点/主从架构下分布式锁的不可靠问题。当主节点故障时&#xff0c;若从节点未同步锁信息&#xff0c;可能导致多个客户端同时持有锁&#xff0c;破坏互斥性。 典型问题案例&#xff1a; 主从切换锁丢失&…...

Vivado中Tri_mode_ethernet_mac的时序约束、分析、调整——(五)调试注意的问题

一、几个注意点 1、每个bank中IO的组织形式 1Bank的52Pins分4 Byte Group&#xff0c;每Byte Group 13PinsNibble_up 7Pins Nibble_low 6Pins。 每个nibble一个bitslice_control管理自己的6~7个pins 。 每个pin对应一个bitslice&#xff0c;它内部又包含多个component&#…...

MFC文件-写MP4

下载本文件 本文件将创作MP4视频文件代码整合到两个文件中&#xff08;Mp4Writer.h和Mp4Writer.cpp)&#xff0c;将IYUV视频流&#xff0c;PCM音频流写入MP4文件。本文件仅适用于MFC程序。 使用方法 1.创建MFC项目。 2.将Mp4Writer.h和Mp4Writer.cpp文件复制到项目目录下。 3…...

PyTorch 深度学习实战(39):归一化技术对比(BN/LN/IN/GN)

在上一篇文章中&#xff0c;我们全面解析了注意力机制的发展历程。本文将深入探讨深度学习中的归一化技术&#xff0c;对比分析BatchNorm、LayerNorm、InstanceNorm和GroupNorm四种主流方法&#xff0c;并通过PyTorch实现它们在图像分类和生成任务中的应用效果。 一、归一化技术…...

C#/.NET/.NET Core技术前沿周刊 | 第 35 期(2025年4.14-4.20)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…...

柱状图QCPBars

一、QCPBars 概述 QCPBars 是 QCustomPlot 中用于绘制柱状图/条形图的类&#xff0c;支持单组或多组柱状图显示&#xff0c;可自定义宽度、颜色和间距等属性。 二、主要属性 属性类型描述widthdouble柱子的宽度&#xff08;坐标轴单位&#xff09;widthTypeWidthType宽度计算…...

2025-04-20 李沐深度学习4 —— 自动求导

文章目录 1 导数拓展1.1 标量导数1.2 梯度&#xff1a;向量的导数1.3 扩展到矩阵1.4 链式法则 2 自动求导2.1 计算图2.2 正向模式2.3 反向模式 3 实战&#xff1a;自动求导3.1 简单示例3.2 非标量的反向传播3.3 分离计算3.4 Python 控制流 硬件配置&#xff1a; Windows 11Inte…...