【C++进阶十】多态深度剖析
【C++进阶十】多态深度剖析
- 1.多态的概念及条件
- 2.虚函数的重写
- 3.重写、重定义、重载区别
- 4.C++11新增的override 和final
- 5.抽象类
- 6.虚表指针和虚表
- 6.1什么是虚表指针
- 6.2指向谁调用谁,传父类调用父类,传子类调用子类
- 7.多态的原理
- 8.单继承的虚表状态
- 9.多继承的虚表状态
- 10.菱形继承
- 11.菱形虚继承
1.多态的概念及条件
继承是实现多态的前提
通俗来说,多态就是多种状态,父子对象完成相同任务会产生不同的结果
例如:成年人买火车票是全价票,学生买票是折扣票
在继承中构成多态要有两个条件:
- 必须通过父类的指针或引用去调用
- 被调用的函数必须是虚函数,且完成虚函数的重写
2.虚函数的重写
什么是虚函数:
被virtual修饰的类成员函数称为虚函数
什么是虚函数的重写(覆盖):
三同:父子虚函数的函数名、返回值类型和参数相同
(参数的缺省值可以不同)
传递不同的对象调用不同的函数
传父类调用的是父类的虚函数
传子类调用的是子类的虚函数
虚函数重写的例外:
-
子类的虚函数可以不加virtual
重写体现了接口继承:子类把函数的声明继承下来,重写的是函数的实现,所以不写virtual也可以满足多态的条件
-
协变:子类与父类的虚函数返回值类型不同,但必须满足父类虚函数返回父类对象的指针或引用,子类虚函数返回子类对象的指针或引用
这个父子类指针也可以是自己的父子类,也可以是指其他类型的父子类:
子类的虚函数可以不加virtual可以防止析构函数出错:
正确使用析构函数:
父类和子类的虚函数的析构函数函数名并不相同却依然构成虚函数的重写,因为析构函数在多态中会被编译器修改成同一个名字
为什么会变成同一个名字:析构函数会因为父子类关系,在子类调用析构后会自动调用父类的析构,如果父子的析构函数不是虚函数,调用析构时就不会调用子类的析构,即使我们指向了子类
为什么没有调用到子类:因为delete的内部构成是:析构函数和operator delete(),而operator delete 有一个特点就是调用delete的指针是什么类型的,就会调用什么类型的析构函数,上图的两个指针p1和p2都是父类person类型,所以就都调用了父类person的析构函数,没有调动子类的析构函数
实际使用结果如下:
所以想要指向父类调用父类析构,指向子类调用子类析构,就需要编译器把析构函数的名字进行了统一,满足了虚函数重写的三同:父子虚函数的函数名、返回值类型和参数相同
子类可以不写virtual,只要父类加上了virtual就可以进行虚函数的重写,但是不太建议
3.重写、重定义、重载区别
4.C++11新增的override 和final
overrride:检查子类虚函数是否重写了父类的某个虚函数,如果没有重写编译报错
final:修饰虚函数,表示该虚函数不能被重写
5.抽象类
在虚函数后面写上=0,这个虚函数被称为纯虚函数,包含纯虚函数的类叫做抽象类,抽象类不能实例化对象
若创建一个子类继承抽象类,则该子类也包含纯虚函数,子类也会变成抽象类,所以子类创建对象也会报错
6.虚表指针和虚表
6.1什么是虚表指针
sizeof(Base) 大小是多少?
以结构体的内存对齐考虑,在32位机器下,大小应为8字节,但是实际上为12字节
_vfptr代表虚函数表指针
加上虚表指针,内存对齐后字节大小为12
6.2指向谁调用谁,传父类调用父类,传子类调用子类
- 父类对象的虚表与子类对象的虚表没有任何关系,这是两个不同的对象
- 通过虚表指针和虚函数表就可以实现多态性,即可以在运行时确定应该调用哪个类的虚函数
- 虚表指针是类级别的,而不是函数级别的
- 每个类只有一个虚表指针,指向其对应的虚函数表,但是多继承的时候,就会可能有多张虚表
- 每一个类中的虚函数在虚表中都有地址
如图所示, 图中父子类各自的虚表指针指向的虚表以及虚表内部的地址并不相同,这证明了父类的虚表指针和子类的虚表指针指向的虚表并不是同一个
7.多态的原理
class Person
{
public:virtual void BuyTicket(){cout << "成人:全价票" << endl;}
};class Student : public Person
{
public:virtual void BuyTicket() {cout << "学生:半价票" << endl;}
};void func(Person* p)
{p->BuyTicket();//父类指针指向父类对象A(或子类对象B)
}int main()
{Person A;func(&A);//传父类对象Student B;func(&B);//传子类对象return 0;
}
父类对象内的虚函数放进了父类的虚表,子类对象继承了父类的同时也继承了父类的虚表,如果子类有虚函数的重写,那么父类的虚表内有父类的虚函数,子类的虚表内有子类的虚函数(重写后的虚函数)
指向谁调用谁,父类指针指向父类对象,则从父类的虚表中找到父类的虚函数;父类指针指向子类对象,则从子类的虚表中找到子类的虚函数,因此产生了指向父类调用父类,指向子类调用子类的现象
不是多态则是在编译时就是已经指向了某个地方,而不是因为指向谁调用了谁
多态的本质在底层看来就是在虚表内寻找虚函数
虚函数和普通函数一样都是存在于代码段中的,而不是存在虚表内部的,虚表内部仅仅储存了虚函数的地址,而虚表储存在常量区上
虚函数表 本质是一个虚函数指针数组
子类的虚表是由父类的虚表拷贝过来的,再向其中填入新的地址,所以造成覆盖
为什么父类对象不可以实现多态,必须是父类的指针或引用?
若为父类对象,就会把子类中属于父类的那一部分拷贝给父类,有可能把子类的虚表也拷贝给父类,若拷贝成功,则父类对象的虚表就不知道是父类的虚表还是子类的虚表了
若为指针或者引用,将子类中属于父类那一部分切出来,使指针指向属于父类那一部分,或者作为属于父类那一部分的别名,子类的虚表还是子类的
8.单继承的虚表状态
class A
{
public:virtual void func1(){cout << "A::func1" << endl;}virtual void func2(){cout << "A::func2" << endl;}
};class B : public A
{
public:virtual void func1(){cout << "B::func1" << endl;}virtual void func3(){cout << "B::func3" << endl;}virtual void func4(){cout << "B::func4" << endl;}
};int main()
{A a;B b;return 0;
}
可以看到子类的虚表不正常,因为每个类中的虚函数在虚表中都要出现,而子类虚表里少了两个虚函数的地址,func1是重写的,func2是继承的(没有重写),而func3和func4不见了,子类自己的虚函数消失了
这里可以解释为一种bug:是Visual Studio监视窗口的bug
也可也理解为:子类的虚表实际上是拷贝了父类的虚表,重写的部分进行覆盖,没有重写的部分原模原样地拷贝,可以说是子类的虚表被隐藏了
9.多继承的虚表状态
class A
{
public:virtual void func1(){cout << "A::func1" << endl;}virtual void func2(){cout << "A::func2" << endl;}
private:int a;
};class B
{
public:virtual void func1(){cout << "B::func1" << endl;}virtual void func2(){cout << "B::func2" << endl;}
private:int b;
};class C : public A, public B
{
public:virtual void func1(){cout << "C::func1" << endl;}virtual void func3(){cout << "C::func3" << endl;}
private:int c;
};int main()
{C temp;return 0;
}
C由两个部分构成,第一个是继承了A, 一个类中只有一个虚表指针,所以A内部有一个虚表指针和一个int类型的对象a,第二个是继承了B, 一个类中只有一个虚表指针,所以B内部有一个虚表指针和一个int类型的对象b
C类的虚函数func3放到了继承的第一个类A的虚表内部
所以C中有两个虚表指针,同时这里的两个虚表指针不能合二为一,这关系于切片问题
所以多继承内部可能会有多个虚表指针
10.菱形继承
class A
{
public:virtual void func1(){cout << "A::func1" << endl;}
private:int a;
};class B : public A
{
public:virtual void func2(){cout << "B::func2" << endl;}
private:int b;
};class C : public A
{
public:virtual void func3(){cout << "C::func3" << endl;}
private:int c;
};class D : public B,public C
{
public:virtual void func4(){cout << "D::func4" << endl;}
private:int a;
};int main()
{D temp;return 0;
}
菱形继承和多继承没区别,同时func4放入了B的虚表内部
D类对象temp有两张虚表,分别是B和C的虚表
11.菱形虚继承
class A
{
public:virtual void func1(){cout << "A::func1" << endl;}int _a = 1;
};class B : virtual public A
{
public:virtual void func1(){cout << "B::func1" << endl;}int _b = 2;
};class C : virtual public A
{
public:virtual void func1(){cout << "C::func1" << endl;}int _c = 3;
};class D : public B,public C
{
public:virtual void func1(){cout << "D::func1" << endl;}virtual void func2(){cout << "D::func2" << endl;}int _d = 4;
};int main()
{D temp;return 0;
}
A的虚表由B、C共享
D自己新增的func2需要虚表,但D对象中的B没有的虚表
虚基表存储偏移量,帮助B、C找到A
注意:上述的B、C没有新增额外虚函数,如果有新增,则D的虚表消失,B和C各有一张虚表,D的虚函数放入B的虚表内,共计三张虚表
class A
{
public:virtual void func1(){cout << "A::func1" << endl;}int _a = 1;
};class B : virtual public A
{
public:virtual void func1(){cout << "B::func1" << endl;}virtual void func3(){cout << "B::func3" << endl;}int _b = 2;
};class C : virtual public A
{
public:virtual void func1(){cout << "C::func1" << endl;}virtual void func4(){cout << "C::func4" << endl;}int _c = 3;
};class D : public B,public C
{
public:virtual void func1(){cout << "D::func1" << endl;}virtual void func2(){cout << "D::func2" << endl;}int _d = 4;
};int main()
{D temp;return 0;
}
相关文章:
【C++进阶十】多态深度剖析
【C进阶十】多态深度剖析 1.多态的概念及条件2.虚函数的重写3.重写、重定义、重载区别4.C11新增的override 和final5.抽象类6.虚表指针和虚表6.1什么是虚表指针6.2指向谁调用谁,传父类调用父类,传子类调用子类 7.多态的原理8.单继承的虚表状态9.多继承的…...
网络传输中字节序
在小端字节序主机发送数据 0x1234 的情况下,(单字节没有字节序)我们可以分步骤来分析接收端如何解析这个数据: 1. 小端字节序主机的存储方式 在小端字节序中,低地址存储低字节,高地址存储高字节。 数据 0x1234 的字节表示为: 低字节:0x34 高字节:0x12 因此,在小端字…...
前端- ElementPlus入门
1.介绍 Element:是饿了么公司前端开发团队提供的一套基于 Vue3 的网站组件库,用于快速构建网页。 Element 提供了很多组件供我们使用。例如 超链接、按钮、图片、表格等等。 官方网站:一个 Vue 3 UI 框架 | Element Plus 2.步骤 1.安装E…...
AI Agent 要用到的技术
AI 发展是大趋势,以下是目前要用到的一些技术项 不论你从事哪个方向,这个技术栈都有必要学习 LangChainTransformersMicrosoft Semantic KernelLangflowLangGrphLangSmith 学习网站 以下是 LangChain、Transformers、Microsoft Semantic Kernel 的学习…...
# 从零构建一个简单的卷积神经网络:手写数字识别
从零构建一个简单的卷积神经网络:手写数字识别 在深度学习的世界里,卷积神经网络(CNN)是处理图像数据的强大工具。今天,我们将通过一个简单的例子,从零开始构建一个CNN模型,用于手写数字识别。…...
【RK3588嵌入式图形编程】-Cairo-Cairo图形库支持后端
Cairo图形库支持后端 文章目录 Cairo图形库支持后端1、PNG图像后端2、PDF文件后端3、SVG文件后端4、GTK窗口支持Cairo库支持多种后端。在本文中,我们使用Cairo创建PNG图像、PDF文件、SVG文件,并在GTK窗口上绘制。 1、PNG图像后端 在第一个示例中,我们创建一个 PNG 图像。 …...
LCD,LED
本文来源 : 腾讯元宝 LCD(Liquid Crystal Display)液晶显示器 LCD本身并不能发光,而是控制光的传输。 LCD内充满了棒状的液态分子(液晶),这些分子可以形成扭转的螺旋线,弯曲来自显示器背后光源产生的光线或…...
HTML 元素
什么是 HTML 元素? HTML 元素(Element)是构成 HTML 文档的基本单位,它由开始标签、内容和结束标签组成,用于定义网页的结构和内容。元素是 HTML 标记语言的核心概念,每个元素都有特定的语义和用途。 元素…...
(undone) MIT6.S081 2023 学习笔记 (Day11: LAB10 mmap)
url: https://pdos.csail.mit.edu/6.1810/2023/labs/mmap.html 任务0:讲义如下 (完成) mmap和munmap系统调用允许UNIX程序对其地址空间进行精细控制。它们可用于进程间共享内存、将文件映射到进程地址空间,并作为用户级页面错误处理方案的一部分&#x…...
7400MB/s5050TBW完美结合,全新希捷酷玩530R SSD体验评测
7400MB/s&5050TBW完美结合,全新希捷酷玩530R SSD体验评测 哈喽小伙伴们好,我是Stark-C~ 说到希捷酷玩530 SSD,很多硬核进阶玩家应该都知道,或者说正在使用(比如说我~)。 作为希捷大厂旗下高性能SSD的…...
【数据结构与算法】同余计算 哈希表与前缀和问题特征和模板化思路
加减乘负的类同余计算 加乘模情况 两数和模 : (a b) mod m (a mod m b mod m) mod m乘积模 : (a * b) mod m ((a mod m) * (b mod m)) mod m 加模证明如下 : a q1 * m r1 , b q2 * m r2则 a mod m r1 , b mod m r2(a b) mod m ((q1 q2) * m (r1 r2)) mod m …...
TS 交叉类型
很类似于接口继承啊 哈哈哈 使用type关键字声明交叉类型 // 声明交叉类型 type PersonDetail person & Contactlet theshy:PersonDetail { name:the shy,phone:马头 }交叉类型和接口实现对对象的类型注解的区别与联系 如果在接口继承时发生同名属性冲突会报不兼容的错…...
FreeRTOS学习系列·二值信号量
目录 1. 信号量的基本概念 2. 二值信号量 3. 应用场景 4. 运作机制 5. 信号量控制块 6. 常用信号量函数接口API 6.1 创建二值信号量 xSemaphoreCreateBinary() 6.2 信号量删除函数 vSemaphoreDelete() 6.3 信号量释放函数 6.3.1 xSemaphoreGive() 6.3.2 …...
二叉搜索树 AVL树 红黑树 的性质
二叉搜索树 如何判断一棵树是否是二叉搜索树? 1.方法一 左子树的所有节点值 < 当前节点值,右子树的所有节点值 > 当前节点值,左右子树也必须满足 。 2.方法二 中序遍历,得到的序列是有序的 红黑树 红黑树的性质 1.根…...
分析 Docker 磁盘占用
以下是分析 Docker 磁盘占用的详细步骤和工具指南,帮助开发者快速定位和清理冗余数据: 1. 查看 Docker 磁盘使用概览 docker system df 输出说明: TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 15 …...
LLM提示词设计及多轮对话优化策略在心理健康咨询场景中的应用研究
多轮对话策略:设计LLM提示词并优化多轮对话输出 LLM提示词设计及多轮对话优化策略在心理健康咨询场景中的应用研究 摘要 本文针对大语言模型(LLM)在心理健康问题咨询对话场景中的应用,系统研究提示词设计方法及多轮对话优化策略。通过分析提示词核心原理,构建包含任务指…...
Kubernetes(k8s)学习笔记(七)--KubeSphere 最小化安装
前情提要 可视化操作面板对于开发、运维绝对是提升工作效率的一大利器,因此很有必要搭建一套可视化操作来管理Kubernetes。 可视化面板有多种: 1.Kubernetes官方提供的默认面板:dashboard,用处不大,放弃;…...
面向对象与过程介绍
一、面向对象具体介绍 (1)基本概念 1.对象 在面向对象编程中,对象是对现实世界中事物的抽象,它具有状态(属性)和行为(方法)。在 TypeScript 中,我们可以通过类、接口等…...
UniGetUI 使用指南:轻松管理 Windows 软件(包括CUDA)
UniGetUI(前身为 WingetUI)是一款专门为 Windows 10(x64)和 Windows 11 系统打造的图形化包管理器界面工具。它集成了 Winget、Scoop、Chocolatey、Npm、Pip、Cargo、vcpkg、.NET Tool 和 PowerShell 等多种常用包管理器的功能&am…...
使用 NGINX 实现 HTTP Basic 认证ngx_http_auth_basic_module 模块
一、前言 在 Web 应用中,对部分资源进行访问控制是十分常见的需求。除了基于 IP 限制、JWT 验证、子请求校验等方式外,最经典也最简单的一种方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模块支持基于用户名和密码的基…...
014枚举之指针尺取——算法备赛
枚举是数据结构与算法中基本的操作,常用于解决序列的区间问题。算法界将"双指针"视为其重要分支,类似地当然还有"三指针",“四指针”,最常见的还是“双指针”,我认为它们应统称为“指针尺取”。 双…...
Python小酷库系列:bidict,可以双向查询的dict
bidict,可以双向查询的dict 基本使用创建双向字典正向查找(key → value)反向查找(value → key)添加新项删除项 进阶功能使用 ~ (.inverse)获取逆映射使用 namedbidict 创建具名双向字典批量更…...
Android Compose 中 CompositionLocal 的全面解析与最佳实践
CompositionLocal 在 Android Compose 中的详细总结 核心概念 CompositionLocal 是 Jetpack Compose 提供的一种隐式数据传递机制,允许数据在组件树中向下传递,而无需显式地通过每个 Composable 函数的参数传递。 两种创建方式 1. staticComposition…...
Qt开发:容器组控件的介绍和使用
文章目录 一、Group Box(分组框)1.1 QGroupBox 简介1.2 基本用法1.3 设置为可勾选(可启用/禁用子控件)1.4 信号与槽连接(监控勾选状态)1.5 布局示例(完整) 二、Scroll Areaÿ…...
JS逆向入门案例1——集思录登录
JS逆向入门案例1——集思录登录 前言声明网站流程分析总结 前言 由于这段时间本职工作比较繁忙,没有很多空余的时间去研究各大厂的加密风控了,想起来自己刚接触js逆向走过坎坷,所以决定出一期js入门案例分析,为刚接触js逆向的小伙…...
ARM子程序和栈
微处理器中的栈由栈指针指向存储器中的栈顶来实现,当数据项入栈时,栈 指针向上移动,当数据项出栈时,栈指针向下移动。 实现栈时需要做出两个决定:一是当数据项进栈时是向低位地址方向向上生 长(图a和图b&a…...
笔试专题(十五)
文章目录 排序子序列题解代码 消减整数题解代码 最长公共子序列(二)题解代码 排序子序列 题目链接 题解 1. 贪心 模拟 2. 1 2 3 2 2 应该是有两个排列子序列的,所以i n-1时ret 3. 把水平的位置和上升部分,水平位置和下降部分分为一个排列子序列 代…...
使用OpenCV 和 Dlib 进行卷积神经网络人脸检测
文章目录 引言1.准备工作2.代码解析2.1 导入必要的库2.2 加载CNN人脸检测模型2.3 加载并预处理图像2.4 进行人脸检测2.5 绘制检测结果2.6 显示结果 3.完整代码4.性能考虑5.总结 引言 人脸检测是计算机视觉中最基础也最重要的任务之一。今天我将分享如何使用dlib库中的CNN人脸检…...
某信服EDR3.5.30.ISO安装测试(一)
一、前言 1.某信服EDR3.5.30 以下简称“EDR3.5”,即统一端点安全管理系统aES(终端检测响应EDR), 官网最新版:aES6.0.1R2,可下载的最低版本:EDR3.7.11R3, 下载地址:统一端点安全管理系统aES-…...
Dify 快速构建和部署基于LLM的应用程序
本文先对Dify做一个初步的认识,然后以一个实际的简单金融问答案例,配置chatflow 工作流。 一、Dify简介 如果你是第一次接触Dify,可以先创建一个简单的聊天助手,初步感觉一下,Dify在构建聊天问答类应用的过程。 比如…...
精益数据分析(40/126):移动应用商业模式的关键指标与盈利策略
精益数据分析(40/126):移动应用商业模式的关键指标与盈利策略 在创业和数据分析的探索之路上,我们持续挖掘不同商业模式的内在规律,以寻求更好的发展机遇。今天,我们依旧秉持共同进步的理念,深…...
JavaScript 实现输入框的撤销功能
在 Web 开发中,为输入框添加撤销功能可以极大地提升用户体验,方便用户快速回滚到之前的输入状态。本文将通过一段简单的 HTML、CSS 和 JavaScript 代码,详细介绍如何实现输入框的撤销功能。 整体实现思路 利用 JavaScript 监听输入框的inpu…...
【C++】类和对象(一)
前言 类和对象第一部分知识包括定义访问限定符类域实例化this指针 本人其他文章:恋风诗 文章中的源码[gitte]:mozhengy 类和对象(一) 前言1. 类的定义引例1.1 类定义格式1.2 类的访问限定符1.3 类域 2. 实例化2.1 实例化概念2.2 …...
【Vue】Vue3源码解析与实现原理
个人主页:Guiat 归属专栏:Vue 文章目录 1. Vue 3 架构概览1.1 模块化设计1.2 整体流程 2. 响应式系统2.1 响应式原理2.2 ref 和 reactive2.3 依赖收集与触发更新 3. 渲染系统3.1 虚拟DOM设计3.2 渲染管线3.3 Patch算法与Diff优化 4. 组件系统4.1 组件创建…...
黑马点评day02(缓存)
2、商户查询缓存 2.1 什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震…...
数据库MySQL学习——day9(聚合函数与分组数据)
文章目录 1. 聚合函数1.1 COUNT() 函数1.2 SUM() 函数1.3 AVG() 函数1.4 MIN() 函数1.5 MAX() 函数 2. GROUP BY 子句2.1 使用 GROUP BY 进行数据分组2.2 结合聚合函数 3. HAVING 子句3.1 使用 HAVING 过滤分组数据3.2 HAVING 和 WHERE 的区别 4. 实践任务4.1 创建一个销售表4.…...
为React组件库引入自动化测试:从零到完善的实践之路
为什么我们需要测试? 我们的ReactTypeScript业务组件库已经稳定运行了一段时间,主要承载各类UI展示组件,如卡片、通知等。项目初期,迫于紧张的开发周期,我们暂时搁置了自动化测试的引入。当时团队成员对组件逻辑了如指…...
数据结构——算法复杂度
一、数据结构定义 数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希…...
Vue3响应式原理那些事
文章目录 1 响应式基础:Proxy 与 Reflect1.1 Proxy 代理拦截1.2 Reflect 确保 `this` 指向正确1.2.1 修正 `this` 指向问题1.2.2 统一的操作返回值1.3 与 Vue2 的对比2 依赖收集与触发机制2.1 全局依赖存储结构:WeakMap → Map → Set2.2 依赖收集触发时机2.3 依赖收集核心实…...
记9(Torch
目录 1、Troch 1、Troch 函数说明举例torch.tensor()torch.arange()创建张量创建一个标量:torch.tensor(42)创建一个一维张量:torch.tensor([1, 2, 3])创建一个二维张量:torch.tensor([[1, 2], [3, 4]])生成一维等差张量:语法&am…...
机器学习模型训练模块技术文档
一、模块结构概览 import numpy as np from sklearn.model_selection import cross_validate, learning_curve from sklearn.pipeline import make_pipeline from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing imp…...
健康养生:从微小改变开始
养生不必大刀阔斧,几个微小改变,就能让健康慢慢扎根生活。晨起别急着洗漱,先花 5 分钟靠墙站立,拉伸脊柱、调整体态,唤醒身体。早餐把白米粥换成杂粮粥,搭配水煮蛋和一小碟凉拌黄瓜,营养更全面。…...
某信服EDR3.5.30.ISO安装测试(二)
一、物理机启动EDR 1、修复dracut 使用DiskGenius克隆虚拟磁盘到物理磁盘,将虚拟机移植到物理机,因为磁盘UUID变化等原因,首次默认启动失败,提示: Starting Dracut Emergency Shell... Warning:/dev/centos/root doe…...
Leetcode:回文链表
1、题目描述 给定一个链表的 头节点 head ,请判断其是否为回文链表。 如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。 示例 1: 输入: head [1,2,3,3,2,1] 输出: true 示例 2: 输入: head [1,2] 输出: …...
IL2CPP 技术深度解析
IL2CPP 是 Unity 开发的高性能脚本后端,它将 .NET 的中间语言 (IL) 转换为 C 代码,再编译为原生平台二进制文件。以下是 IL2CPP 的全面技术剖析。 一、架构设计原理 1. 整体编译流程 C# 源代码 → Roslyn 编译器 → IL (.NET DLL)→ IL2CPP 转换器 →…...
AI图片修复工具,一键操作,图片更清晰!
泛黄的老相册里藏着一座记忆博物馆,每张照片都是时光长河中的琥珀。祖父军装照上的折痕里藏着抗美援朝的故事,父母结婚照褪色的红唇映照着八十年代的风尚,童年抓拍照上模糊的身影正重演着我们成长的轨迹。这些承载着集体记忆的影像࿰…...
国内短剧 vs. 海外短剧系统:如何选择?2025年深度对比与SEO优化指南
在短剧市场爆发式增长的背景下,国内与海外短剧系统成为创业者与企业的热门选择。本文将从市场潜力、开发成本、内容创作、盈利模式及风险五大维度,结合最新行业数据与案例,深度解析两者的优劣势,助您做出最优决策。 一、市场前…...
linux crash工具详解
crash 是 Linux 系统中用于分析内核转储文件(如 vmcore 或 kdump 生成的 dump 文件)的核心工具。它结合了调试符号和内核数据结构,能够直观地查看崩溃时的系统状态。以下是其详细使用方法及核心功能解析: 一、安装与准备 1. 安装…...
Scala day6(Class,field,Single Object)
Foreword【こんにちは】 Today, we continue to learn Scala Language, though the Scala isn’t easy for Begainner, Big Data Technology need Scala Language, Spark【Distributed Calculation FrameWork】is based on Scala Language designed. I know the learning road…...
不小心把当前的环境变量路径覆盖掉怎么办
起因 配置环境变量(~/.bashrc)的时候没加:$PATH,导致 source ~/.bashrc之后只剩下刚刚配置的环境变量了。连vim都打不开 解决 添加临时环境变量export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH再重新修改…...