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

C++ --- 多态

1 多态的概念

多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的 函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在 编译时完成的,我们把编译时⼀般归为静态,运⾏时归为动态。

运⾏时多态,具体点就是去完成某个⾏为(函数),可以传不同的对象就会完成不同的⾏为,就达到多种 形态。⽐如买票这个⾏为,当普通⼈买票时,是全价买票;学⽣买票时,是优惠买票(5折或75折);军 ⼈买票时是优先买票。再⽐如,同样是动物叫的⼀个⾏为(函数),传猫对象过去,就是"(>^ω^<)喵",传狗对象过去,就是"汪汪"。

2 多态的定义以及实现 

 2.1多态的构成条件

多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了 Person。Person对象买票全价,Student对象优惠买票

2.1.1实现多态还有两个必须重要条件

必须是基类的指针或者引⽤调⽤虚函数。

被调⽤的函数必须是虚函数,并且完成了虚函数重写/覆盖。

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

2.1.2 虚函数

类成员函数前⾯加virtual修饰,那么这个成员函数被称为虚函数。注意⾮成员函数不能加virtual修饰。

2.1.3 虚函数的重写/覆盖

虚函数的重写/覆盖:派⽣类中有⼀个跟基类完全相同的虚函数(即派⽣类虚函数与基类虚函数的返回值 类型、函数名字、参数列表完全相同),称派⽣类的虚函数重写了基类的虚函数。         注意:在重写基类虚函数时,派⽣类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承 后基类的虚函数被继承下来了在派⽣类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样 使⽤,不过在考试选择题中,经常会故意买这个坑,让你判断是否构成多态。

2.1.4 析构函数的重写

        基类的析构函数为虚函数,此时派⽣类析构函数只要定义,⽆论是否加virtual关键字,都与基类的析 构函数构成重写,虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则,实际上编译器对析 构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以基类的析构函数加了 vialtual修饰,派⽣类的析构函数就构成重写。

        下⾯的代码我们可以看到,如果~A(),不加virtual,那么deletep2时只调⽤的A的析构函数,没有调⽤ B的析构函数,就会导致内存泄漏问题,因为~B()中在释放资源。

        注意:这个问题⾯试中经常考察,⼤家⼀定要结合类似下⾯的样例才能讲清楚,为什么基类中的析构 函数建议设计为虚函数

2.1.5 override和final关键字

从上⾯可以看出,C++对虚函数重写的要求⽐较严格,但是有些情况下由于疏忽,⽐如函数名写错参数写错等导致⽆法构成重写,⽽这种错误在编译期间是不会报出的,只有在程序运⾏时没有得到预期结果才来debug会得不偿失,因此C++11提供了override,可以帮助⽤户检测是否重写。如果我们不想让 派⽣类重写这个虚函数,那么可以⽤final去修饰

2.1.6 重载、覆盖(重写)、隐藏(重定义)的对比

3 纯虚函数和抽象类 

 在虚函数的后⾯写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被 派⽣类重写,但是语法上可以实现),只要声明即可。包含纯虚函数的类叫做抽象类,抽象类不能实例 化出对象,如果派⽣类继承后不重写纯虚函数,那么派⽣类也是抽象类。纯虚函数某种程度上强制了 派⽣类重写虚函数,因为不重写实例化不出对象。

4 多态的原理 

4.1虚函数表指针 

来看这么一个代码:你觉得他会输出几呢?

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;
}

上⾯题⽬运⾏结果12bytes,除了_b和_ch成员,还多⼀个__vfptr放在对象的前⾯(注意有些平台可能 会放到对象的最后⾯,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v代表virtual,f代表function)。⼀个含有虚函数的类中都⾄少都有⼀个虚函数表指针,因为⼀个类所有虚函数的地址要被放到这个类对象的虚函数表中,虚函数表也简称虚表。

4.2 多态的原理

4.2.1多态时如何实现的

从底层的⻆度Func函数中ptr->BuyTicket(),是如何作为ptr指向Person对象调用Person::BuyTicket, ptr指向Student对象调⽤Student::BuyTicket的呢?通过下图我们可以看到,满⾜多态条件后,底层 不再是编译时通过调⽤对象确定函数的地址,⽽是运⾏时到指向的对象的虚表中确定对应的虚函数的 地址,这样就实现了指针或引⽤指向基类就调⽤基类的虚函数,指向派⽣类就调⽤派⽣类对应的虚函 数。第⼀张图,ptr指向的Person对象,调⽤的是Person的虚函数;第⼆张图,ptr指向的Student对 象,调⽤的是Student的虚函数。

class Person {
public:virtual void BuyTicket() { cout << "买票-全价" << endl; }
private:string _name;
};class Student : public Person {
public:virtual void BuyTicket() { cout << "买票-打折" << endl; }
private:string _id;
};class Soldier : public Person {
public:virtual void BuyTicket() { cout << "买票-优先" << endl; }
private:string _codename;
};void Func(Person& ptr)
{// 这里可以看到虽然都是Person指针Ptr在调用BuyTicket// 但是跟ptr没关系,而是由ptr指向的对象决定的。ptr.BuyTicket();
}int main()
{// 其次多态不仅仅发生在派生类对象之间,多个派生类继承基类,重写虚函数后// 多态也会发生在多个派生类之间。Person ps;Student st;Soldier sr;Func(ps);Func(st);Func(sr);return 0;
}

这里就时清晰明了的看得到Person,Student,Soldier这三个里面的vfptr各自不同,即使是Student,Soldier这两个是继承的Person类的虚函数,那么他们的虚函数地址也是不一样的。

4.2.2 动态绑定与静态绑定

对不满⾜多态条件(指针或者引⽤+调⽤虚函数)的函数调⽤是在编译时绑定,也就是编译时确定调⽤ 函数的地址,叫做静态绑定。

满⾜多态条件的函数调⽤是在运⾏时绑定,也就是在运⾏时到指向对象的虚函数表中找到调⽤函数的地址,也就做动态绑定。

// ptr是指针+BuyTicket是虚函数满⾜多态条件。
// 这⾥就是动态绑定,编译在运⾏时到ptr指向对象的虚函数表中确定调⽤函数地址ptr->BuyTicket();
00EF2001  mov         eax,dword ptr [ptr] 
00EF2004  mov         edx,dword ptr [eax]
00EF2006  mov         esi,esp 
00EF2008  mov         ecx,dword ptr [ptr]  
00EF200B  mov         eax,dword ptr [edx]  
00EF200D  call        eax// BuyTicket不是虚函数,不满⾜多态条件。
// 这⾥就是静态绑定,编译器直接确定调⽤函数地址ptr->BuyTicket();
00EA2C91  mov         
00EA2C94  call        

4.2.3 虚函数表

1 基类对象的虚函数表中存放基类所有虚函数的地址。同类型的对象共⽤同⼀张虚表,不同类型的对 象各⾃有独⽴的虚表,所以基类和派⽣类有各⾃独⽴的虚表。

2 派⽣类由两部分构成,继承下来的基类和⾃⼰的成员,⼀般情况下,继承下来的基类中有虚函数表 指针,⾃⼰就不会再⽣成虚函数表指针。但是要注意的这⾥继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派⽣类对象中的基类对象成员也独立的。

3 派⽣类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函 数地址。

4 派⽣类的虚函数表中包含,(1)基类的虚函数地址,(2)派⽣类重写的虚函数地址完成覆盖,派⽣类 ⾃⼰的虚函数地址三个部分。

5 虚函数表本质是⼀个存虚函数指针的指针数组,⼀般情况这个数组最后⾯放了⼀个0x00000000标 记。(这个C++并没有进⾏规定,各个编译器⾃⾏定义的,vs系列编译器会再后⾯放个0x00000000 标记,g++系列编译不会放)

6 虚函数存在哪的?虚函数和普通函数⼀样的,编译好后是⼀段指令,都是存在代码段的,只是虚函数的地址⼜存到了虚表中。

7 虚函数表存在哪的?这个问题严格说并没有标准答案C++标准并没有规定,我们写下⾯的代码可以 对⽐验证⼀下。vs下是存在代码段(常量区)

class Base {
public:virtual void func1() { cout << "Base::func1" << endl;}virtual void func2(){ cout << "Base::func2" << endl;}void func5() { cout << "Base::func5" << endl;}
protected:int a = 1;
};
class Derive : public Base
{
public:virtual void func1() { cout << "Derive::func1" << endl; }virtual void func3() {cout << "Derive::func1" << endl;}void func4() { cout << "Derive::func4" << endl;}
protected:int b = 2;
};int main()
{Base b;Derive d;return 0;}

这可以根据在内存中栈,静态区,堆,常量区对比地址来确定这个虚函数表的地址大概在什么地方:

int main()
{Base b1;Base b2;Derive d1;Derive d2;d1.Func1();list<int> lt = { 1,2,3,4,5,6 };int i = 0;static int j = 1;int* p1 = new int;const char* p2 = "xxxxxxxx";printf("栈:%p\n", &i);printf("静态区:%p\n", &j);printf("堆:%p\n", p1);printf("常量区:%p\n", p2);Base b;Derive d;Base* p3 = &b;Derive* p4 = &d;printf("Base虚表地址:%p\n", *(int*)p3);printf("Derive虚表地址:%p\n", *(int*)p4);printf("虚函数地址:%p\n", &Base::Func1);printf("普通函数地址:%p\n", &Base::Func3);return 0;
}

相关文章:

C++ --- 多态

1 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…...

细说卫星导航:测距定位原理

测距定位原理 1. 伪距测量技术 核心原理&#xff1a;卫星发射信号&#xff0c;用户接收并记录传播时间&#xff0c;乘以光速得到距离&#xff08;伪距&#xff09;。 技术细节&#xff1a; 信号传播路径分析 信号结构&#xff1a; 卫星信号包含三部分&#xff1a; 载波&…...

【AI News | 20250322】每日AI进展

AI Repos 1、DeTikZify 可以把草图或图形转换成TikZ代码的模型&#xff0c;可用来绘制复杂的科学图表&#xff0c;输入草图或文字描述即可转换成TikZ代码。DeTikZify强大的地方在于它能理解图表的语义信息&#xff0c; 能识别图表中的不同组成部分及其含义&#xff0c;比如坐标…...

【js逆向入门】图灵爬虫练习平台 第九题

地址&#xff1a;aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger&#xff0c;右击选择一律不在此处暂停&#xff0c; 点击继续执行 查看请求信息 查看载荷&#xff0c;2个加密参数&#xff0c;m和tt 查看启动器&#xff0c;打上断点 进来 往…...

重新复活的(手机端)一站式应用管理与下载平台

应用乐园&#xff08;安卓&#xff09; 应用乐园作者去年3月表示&#xff0c;由于精力问题&#xff0c;要停止维护奇妙搜索、应用乐园、奇妙影视这些软件了。 然而最近&#xff0c;令人意外的是&#xff0c;应用乐园竟然“复活”了&#xff01;更准确地说&#xff0c;它进行了…...

AI密码学

嗯&#xff0c;用户给了一个需要破译的密码文档&#xff1a;“Uif qjh jt po uif usff.”&#xff0c;提示是用字母往前推移1的凯撒密码。首先&#xff0c;我得确认自己是否正确理解提示。凯撒密码通常是将字母按照一定位移来替换&#xff0c;这里的提示是往前推1位&#xff0c…...

Python设计模式 - 适配器模式

定义 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它用于将一个类的接口转换为客户端所期待的另一个接口。 注&#xff1a;在适配器模式定义中所提及的接口是指广义的接口&#xff0c;它可以表示一个方法或者一组方法的集合。 结构 …...

S32K324 MCAL SPI波特率配置不对问题排查

文章目录 前言MCAL配置检查SPI时钟源问题处理总结 前言 项目开发过程中&#xff0c;MCAL SPI配置时发现实际配置的波特率和用逻辑分析仪采集的时钟频率对不上&#xff0c;实际的频率只有配置的一半&#xff0c;本文记录该问题的排查过程。 MCAL配置检查 MCAL SPI配置波特率在…...

STM32八股【2】-----ARM架构

1、架构包含哪几部分内容 寄存器处理模式流水线MMU指令集中断FPU总线架构 2、以STM32为例进行介绍 2.1 寄存器 寄存器名称作用R0-R3通用寄存器用于数据传递、计算及函数参数传递&#xff1b;R0 也用于存储函数返回值。R4-R12通用寄存器用于存储局部变量&#xff0c;减少频繁…...

Java 记忆链表,LinkedList 的升级版

文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知&#xff0c;ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构&#xff0c;对应数据结构理论中的数组和链表。但在这两个数据结构&#xff0c;开发者们通常使用 ArrayList&#xff0c;而不使用 LinkedList。JD…...

浔川社团官方联合会维权成功

在2025.3.2日&#xff0c;我社团检测文章侵权中&#xff0c;检测出3篇文章疑似遭侵权&#xff0c;随后&#xff0c;总社团联合会立即联系CSDN版权&#xff0c;经过17天的维权&#xff0c;至今日晚&#xff0c;我社团维权成功&#xff01;侵权文章全部被设置为转载。 在此&…...

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…...

Linux——线程

Linux——线程 目录 一、线程 1.1 创建一个线程 1.2 主函数等待线程结束pthread_join 为什么输出是乱序的 一、线程 线程&#xff1a;进程内部的一条执行路径 进程&#xff1a;一个正在运行的程序 进程相当于工厂车间&#xff0c;线程就是车间里的许多工人 1.1 创建一个…...

dubbo异步调用

Dubbo 异步调用分为 Provider 端异步调用和 Consumer 端异步两种模式。 Consumer 端异步是指发起 RPC 调用后立即返回&#xff0c;调用线程继续处理其他业务逻辑&#xff0c;当响应结果返回后通过回调函数通知消费端结果。Provider 端异步执行将阻塞的业务从 Dubbo 内部线程池…...

2025知识图谱峰会(脱敏)PPT合集(18份).zip

2025知识图谱峰会&#xff08;脱敏&#xff09;PPT合集&#xff0c;共18份。 一、GraphRAG&#xff1a;核心技术与应用 1、多模态GraphRAG初探&#xff1a;文档智能知识图谱大模型结合范式.pdf 2、GraphRAG在CVTE多业务场景下的探索与应用.pdf 二、企业知识管理智能化升级&am…...

Android Studio最后一个绑定JDK8的版本,但是官方下载是最新的,怎么下载Android Studio历史版本包,这篇文章帮你解决。

最近需要安装Android Studio 编辑器 发现官网最新的编辑器已经不支持 jdk8了 经过查阅资料&#xff1a; Android Studio最后一个绑定JDK8的版本:4.1.3 下载地址&#xff1a;https://developer.android.google.cn/studio/archive 如果你打开是这样的 下载页 这是因为你用的中…...

如果我没安装office,只安装了wps,python 如何通过win32com.client.Dispatch操作ppt?

文章目录 win32com.client.Dispatch是干嘛的?什么是Windows COM组件COM和dll有关系吗?python 如何通过win32com.client.Dispatch操作ppt?如果我没安装office,只安装了wps,python 如何通过win32com.client.Dispatch操作ppt?附录:完整报错信息win32com.client.Dispatch是干…...

VSCode扩展工具Copilot MCP使用教程【MCP】

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09; &#xff0c;2024年11月底&#xff0c;由 Anthropic 推出的一种开放标准&#xff0c;旨在统一大型语言模型&#xff08;LLM&#xff09;与外部数据源和工具之间的通信协议。本文章教你使用VSCode…...

什么是PHP伪协议

PHP伪协议是一种特殊的URL格式&#xff0c;允许开发者以不同于传统文件路径访问和操作资源。以下是一些常见的PHP伪协议及其详细介绍&#xff1a; 常见的PHP伪协议 1. **file://** - **用途**&#xff1a;访问本地文件系统。 - **示例**&#xff1a;file:///path/to/file.txt。…...

linux中如何修改文件的权限和拥有者所属组

目录标题 chmod指令八进制形式权限修改文件拥有者所属组的修改umask有关内容 chmod指令 chmod指令可以用来修改人员的权限其形式如下&#xff1a; u代表的是拥有者&#xff0c;g代表的是所属组&#xff0c;o代表的是其他人&#xff0c;a表示所有人&#xff0c;如果你想增加权…...

[项目]基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050配置与读取

基于FreeRTOS的STM32四轴飞行器: 十一.MPU6050 一.芯片介绍二.配置I2C三.编写驱动四.读取任务的测试 一.芯片介绍 芯片应该放置在PCB中间&#xff0c;X Y轴原点&#xff0c;敏感度131表示范围越小越灵敏。理想状态放置在地面上X&#xff0c;Y&#xff0c;Z轴为0&#xff0c;即…...

音频录制小妙招-自制工具-借助浏览器录一段单声道16000采样率wav格式音频

先看效果 1、打开页面 2、点击开始录音&#xff0c;弹出权限提示&#xff0c;点击“仅这次访问时允许” 3、录完后&#xff0c;点击停止 4、文件自动下载到默认目录 上代码 js 部分 document.addEventListener(DOMContentLoaded, () > {const startBtn document.getEleme…...

【计算机网络原理】选择题+简答题

文章目录 选择题网络基础IP网络拓扑 OSI七层模型协议HDLCTCP/IP 交换技术网络安全数字签名 算法与策略 简答题UDPTCP 选择题 网络基础 下列域名中&#xff0c;属于国际顶级域名的是&#xff08;&#xff09; A. us B. tom C. edu D. int 下列关于光纤传输介质的叙述中错误的是…...

【C++网络编程】第2篇:简单的TCP服务器与客户端

一、TCP通信流程回顾 1. 服务器端流程 1. 创建Socket → socket() 2. 绑定地址和端口 → bind() 3. 开始监听 → listen() 4. 接受客户端连接 → accept() 5. 接收/发送数据 → recv()/send() 6. 关闭连接 → closesocket()2. 客户端流程 1. 创建Socket → socket() 2. 连接…...

Matplotlib散点图:如何为每个数据点添加标签

参考 参考链接 How to Label Each Point in Matplotlib Scatter Plots: A Comprehensive Guide Matplotlib scatter label each point is a powerful technique for creating informative and visually appealing scatter plots in Python. This article will explore various …...

自定义reset50模型转换到昇腾om

目录 原始转换脚本 脚本运行报错 基于reset50 模型的自定义网络 基本网络结构 卷积模块定义示例 Bottleneck定义示例 网络定义示例 改进的转换脚本 脚本运行报错channels不匹配 脚本运行报错维度不匹配 模型输入数据的类型 tensor size NCHW和NHWC 自定义网络的通…...

python __name__与__main__深刻理解(涵详细解释、应用场景、代码举例、高级用法)

python __name__与__main__深刻理解(涵详细解释、应用场景、代码举例、高级用法): 一、__name__ 的核心作用 __name__ 是 Python 的内置属性,用于标识当前模块的执行环境,其值取决于模块是被直接运行 还是被导入 到其他模块中: 直接运行 :当模块作为主程序执行时,__na…...

多模态SVG生成新标杆:StarVector从图像文本生成高精度SVG的AI模型

一、引言&#xff1a;矢量图形的崛起与挑战 在现代数字世界中&#xff0c;图像扮演着至关重要的角色&#xff0c;而可伸缩矢量图形&#xff08;SVG&#xff09;正因其独特的优势&#xff0c;在网页设计、图形设计等领域占据着越来越重要的地位。与传统的基于像素的栅格图像不同…...

多线程synchronized——线程“八锁”

一、锁对象的概念 非静态同步方法&#xff1a;锁的是当前实例对象&#xff08;this&#xff09;。当一个实例对象的非静态同步方法获取锁后&#xff0c;该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁。静态同步方法&#xff1a;锁的是当前类的Class对…...

Spring Boot整合MyBatis

准备工作 1、创建SpringBoot项目&#xff0c;以及在pom.xml中添加如下依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version> </depend…...

【第22节】windows网络编程模型(WSAAsyncSelect模型)

目录 引言 一、WSAAsyncSelect模型概述 二、WSAAsyncSelect模型流程 2.1 自定义消息 2.2 创建窗口例程 2.3 初始化套接字 2.4 注册网络事件 2.5 绑定和监听 2.6 消息循环 三、完整示例代码 引言 在网络编程的广袤天地中&#xff0c;高效处理网络事件是构建稳定应用的…...

RTD2525BE《HDMI转EDP,DP转EDP》显示器芯片

一、产品概述 瑞昱RTD2525BE是一款专为高端显示设备设计的多接口转换芯片&#xff0c;支持HDMI 2.0与DisplayPort&#xff08;DP&#xff09;1.4双输入&#xff0c;并高效转换为嵌入式DisplayPort&#xff08;eDP&#xff09;输出。该芯片集成先进信号处理技术&#xff0c;支持…...

【贝叶斯定理(Bayesian Theorem)】

贝叶斯定理&#xff08;Bayesian Theorem&#xff09;是概率论中一个革命性的工具&#xff0c;它将主观信念与客观数据结合&#xff0c;形成了独特的贝叶斯统计体系。以下我们将从数学原理、哲学内涵、实际应用三个维度进行深度解析。 一、贝叶斯定理的数学本质 1. 核心公式的…...

Docker逃逸

判断是否再docker中 1.ls -a / (查看c根目录查看是否有docker配置文件) 2.查看进程 如果在要逃逸到真实环境中&#xff1a; 特权模式进行docker逃逸&#xff1a;管理员执行eddocker run--privileg&#xff0c;如何判断是否是特权模式&#xff08;&#xff09; 特权模式以…...

kotlin 函数引用

引言 先确认一下&#xff0c;什么叫做引用 Object obj new Object() //这里的obj就是一个强引用 再确认一个结论&#xff1a; lambda 属于函数类型对象 。 fun methodResponseResult(msg: String , respo:(Int, String)->Unit){}fun methodRespoResunt(type: Int ,msg: S…...

Linux | 安装 Samba将ubuntu 的存储空间指定为windows 上的一个磁盘

01 安装 samba 文件来实现。比如把我们 ubuntu 的存储空间指定为我们 windows 上的一个磁盘,然后我们在这个磁盘里面创建 .c 文件,进行我们代码的修改和编写,可以安装 samba 文件来实现。 samba 是一种网络共享服务,可以通过网络访问我们指定的文件夹 02 第一步:下…...

Linux小知识

1. /etc目录 我们在配置文件中一直会调用 /etc目录 cd /etc/xxxx.conf etc的全称是editable configuration&#xff08;其中一种说法&#xff09;意为可编辑的配置&#xff1b;此目录主要用来存放系统的配置文件和初始化文件的&#xff1b;像网络配置 用户信息 各种服务的配置…...

冒排排序相关

先说一个阿里云学生无门槛免费领一年2核4g服务器的方法&#xff1a; 阿里云服务器学生无门槛免费领一年2核4g_阿里云学生认证免费服务器-CSDN博客 当谈到排序算法时&#xff0c;冒泡排序&#xff08;Bubble Sort&#xff09;是最简单且最基础的排序算法之一。它的原理是依次比…...

SQLMesh SCD-2 时间维度实战:餐饮菜单价格演化追踪

场景背景&#xff1a;动态菜单价格管理 考虑某连锁餐厅的菜单管理系统&#xff0c;需要记录食品价格的历史变更轨迹。业务需求包括&#xff1a; 记录每次价格调整的时间点支持历史价格查询&#xff08;如"2020年1月2日汉堡多少钱"&#xff09;维护当前有效价格清单…...

深入分析和讲解虚拟化技术原理

随着云计算和大数据技术的飞速发展&#xff0c;虚拟化技术应运而生&#xff0c;成为数据中心和IT基础设施的重要组成部分。本文将深入分析虚拟化的基本原理、主要类型以及在实际应用中的意义。 一、虚拟化技术的定义 虚拟化技术是通过软件将物理硬件资源抽象成虚拟资源的技术&…...

再探C语言(1)

温馨提示&#xff1a; 学C语言就像玩《掘地求升》——你以为懂了语法就能通关&#xff1f; 不&#xff01;编译器会用铁锤教你做人&#xff01;(╯‵□′)╯︵┻━┻ &#x1f431;Part 1&#xff1a;sizeofの跨平台迷惑行为 Q1. 不同环境下sizeof(int)的结果 运行环境结果&a…...

#echarts#折线图#饼图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>折线图</title> </head> <body><div id"app" style"width:100%;height:100%;"><div id"chart-c…...

Three.js世界中的三要素:场景、相机、渲染器

一、Three.js简介 Three.js是一个基于WebGL的JavaScript库&#xff0c;它允许开发者在网页上创建和显示复杂的3D图形和动画&#xff0c;而无需用户安装任何额外的插件或软件。Three.js在Web开发中的地位非常重要&#xff0c;它通过提供简单直观的API&#xff0c;极大地降低了3…...

nginx5天时间从0到熟练掌握学习计划

要在 5 天内熟练地在项目中使用 Nginx&#xff0c;需要制定一个高效的学习计划&#xff0c;重点学习 Nginx 的核心功能和实际应用。以下是一个详细的学习计划&#xff0c;帮助你从零开始掌握 Nginx。 学习目标 掌握 Nginx 的基本概念和安装方法。能够配置 Nginx 托管静态文件、…...

2Dslam前端分类

文章目录 扫描匹配ICP核心思想具体流程&#xff1a; 似然场核心思想&#xff1a;基本原理&#xff1a;具体流程&#xff1a; 扫描匹配 Scan-to-Scan&#xff08;扫描到扫描&#xff09;匹配 扫描到扫描匹配是最基本的扫描匹配方法&#xff0c;通过比较当前扫描数据与上一扫描数…...

SOFABoot-02-模块化隔离方案

sofaboot 前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金…...

Maven环境搭建与配置

1 下载压缩包 官网下载地址: Download Apache Maven – Maven 2 配置系统环境变量 1.x版本配置Maven_HOME2.x版本配置M2_HOME3.x版本配置PATH检查是否配置生效: 打开命令窗口输入:mvn -version 3 配置开发工具IDEA 为什么不使用idea自带的maven插件? ‌版本兼容性问题‌:I…...

设计模式-结构型模式-组合模式

概述 组合模式 : Composite Pattern : 是一种结构型设计模式。 **它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。** 核心思想&#xff1a; 让单个对象 和 组合对象 实现相同的接口&#xff0c;这样就可以在不区分是单个对象还是组合对象的情况下&#xff0c;以相…...

如何使用jenv工具管理多个JDK版本

一、jenv到底是干啥的&#xff1f; 简单来说&#xff0c;jenv就是专门用来管理多个Java版本的工具。不管是开发、测试&#xff0c;还是生产环境&#xff0c;只要你需要在同一台机器上用不同的Java版本&#xff0c;它都能帮上大忙。比如说&#xff0c;项目A要求JDK 8&#xff0…...

macOS 使用 iconv 转化文件编码

文章目录 使用方式支持的编码类型iconv 更多用法 使用方式 iconv -f GB2312 -t UTF-8 分治算法.txt > 分治算法2.txt 支持的编码类型 可以使用 下面命令 查看编码类型 iconv -lPS : ISO-8859 有很多种分支&#xff0c;iconv 支持 ISO-8859-1、ISO-8859-10&#xff0c;但…...