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

C++篇——多态

目录

引言

1,什么是多态

2. 多态的定义及实现

2_1,多态的构成条件

         2_2,虚函数

2_3,虚函数的重写

2_4,虚函数重写的两个例外

        2_4_1,协变(基类与派生类虚函数返回值类型不同)

        2_4_2. 析构函数的重写(基类与派生类析构函数的名字不同)

2_5,为什么要特殊处理析构函数?

2_6,C++11 override 和 final

2_7,重载、覆盖(重写)、隐藏(重定义)的对比

3,抽象类

3_1,概念

3_2,接口继承和实现继承

4,多态原理

4_1虚函数表

4_2多态的原理

4_3,动态绑定与静态绑定

革命尚未成功,同志仍需努力


引言

上一期我们讲解了继承,这一期我们就要开始学习多态啦,废话不多说,下面是多态的学习时间。

1,什么是多态

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。

举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人 买票时是优先买票。

再举个栗子:拼多多砍一刀大家熟悉吧,大家有没有去找小伙伴去砍现金呢?小编我有幸找了块30个小伙伴才成功薅到了50块钱羊毛,在这个中间,我一个同学听说可以领取50块钱,他也下载了一个拼多多,令我气愤的是他就找了7个人砍就拿到了这50块钱。小编猜测拼多多这里就用到了多态,新用户体现的难度是远远小于老用户的。(ps:拼多多砍一刀纯属猜测,大家仅供娱乐。)

2. 多态的定义及实现

2_1,多态的构成条件

多态是在不同的继承关系的类的对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。

那么在继承中要构成多态还有两个条件:

         ~1,必须通过父类的指针或者引用去调用虚函数

         ~2,被调用的函数必须是虚函数,并且派生类对基类的虚函数进行了重写(覆盖)

2_2,虚函数

在上面构成多态的两个条件中我们提到了虚函数的概念,那虚函数是什么呢?

虚函数:即被virtual修饰的类成员函数称为虚函数。

class Person
{
private:string _name;int _age;
public:virtual void buy_ticket(){cout << "成人票 全价100元" << endl;}
};

2_3,虚函数的重写

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

注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议 这样使用

2_4,虚函数重写的两个例外

        2_4_1,协变(基类与派生类虚函数返回值类型不同)

        派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指 针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。

class A{};
class B : public A {};
class Person {
public:virtual A* f() {return new A;}
};
class Student : public Person {
public:virtual B* f() {return new B;}
};

        2_4_2. 析构函数的重写(基类与派生类析构函数的名字不同)

        如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字, 都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同, 看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。

2_5,为什么要特殊处理析构函数?

让我们看以下代码

在这里我们就能够很好的看见, 语句 A* a2 = new B,我们是创建了一个 B 的对象将其指针向上赋值给 A* 。在堆上我们是有 20个 int 的空间,但是delete 只释放了 10个 int 的空间,这时候就空间泄露了。因为delete会去调用 它的析构函数,如果不能构成多态(如上图)它就会调用父类的析构函数,这时候子类的那一部分资源就没有释放,就会有内存泄漏。

我们把析构函数前加上 virtual ,即使析构函数名不一样,也构成多态,在delete的时候,会根据它的实际对象去调用,即调用派生类的析构函数,这时候就不会发生空间泄露了。

2_6,C++11 override 和 final

从上面可以看出,C++对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数 名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的,只有在程序运行时没有 得到预期结果才来debug会得不偿失,因此:C++11提供了override和final两个关键字,可以帮助用户检测是否重写。

 final: 修饰虚函数,表示该虚函数不能再被重写

 override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错。

2_7,重载、覆盖(重写)、隐藏(重定义)的对比

重载,重定义,重写大家是不是有些混淆了,这里给大家梳理一遍

重载 : 首先重载必须在统一作用域中,函数名/参数(包括参数的数量,类型,顺序)相同就构成重载。

重定义(隐藏) : 重定义是在继承中才有的现象,所以构成重定义两个函数的作用域分别在基类和派生类中。 且只要函数名相同,就构成重定义(在不构成重写的情况下)。

重写(覆盖):两个函数分别在基类和派生类的作用域中,且两个函数必须都是虚函数,这两个函数要三同(返回值,函数名,参数),(协变,析构函数除外)。

3,抽象类

3_1,概念

在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口 类),抽象类不能实例化出对象派生类继承后也不能实例化出对象只有重写纯虚函数,派生 类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。

class Car
{
public:virtual void Drive() = 0;
};
class Benz :public Car
{
public:virtual void Drive(){cout << "Benz-舒适" << endl;}
};
class BMW :public Car
{
public:virtual void Drive(){cout << "BMW-操控" << endl;}
};int main()
{Car* car1 = new Benz;Car* car2 = new BMW;car1->Drive();car2->Drive();return 0;
}

3_2,接口继承和实现继承

普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实 现。虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成 多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。

4,多态原理

4_1,虚函数表

// 这里常考一道笔试题:sizeof(Base)是多少?
class Base
{
public:virtual void Func1(){cout << "Func1()" << endl;}
private:int _b = 1;
};

通过观察测试我们发现b对象是 16 bytes(int 4 字节, 指针8字节,对其后是16),除了_b成员,还多一个__vfptr放在对象的前面(注意有些 平台可能会放到对象的最后面,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v代 表virtual,f代表function),我们简称虚表

我们看下列代码

#include <iostream>
using namespace std;class Base
{
public:virtual void Func1(){cout << "Base::Func1()" << endl;}virtual void Func2(){cout << "Base::Func2()" << endl;}void Func3(){cout << "Base::Func3()" << endl;}
private:int _b = 1;
};
class Derive : public Base
{
public:virtual void Func1(){cout << "Derive::Func1()" << endl;}
private:int _d = 2;
};
int main()
{Base b;Derive d;return 0;
}

通过观察和测试,我们发现了以下几点问题:

1. 派生类对象d中也有一个虚表指针,d对象由两部分构成,一部分是父类继承下来的成员,虚表指针也就是存在部分的另一部分是自己的成员。

2. 基类b对象和派生类d对象虚表是不一样的,这里我们发现Func1完成了重写,所以d的虚表 中存的是重写的Derive::Func1,所以虚函数的重写也叫作覆盖,覆盖就是指虚表中虚函数 的覆盖。重写是语法的叫法,覆盖是原理层的叫法。

3. 另外Func2继承下来后是虚函数,所以放进了虚表,Func3也继承下来了,但是不是虚函数,所以不会放进虚表。

4. 虚函数表本质是一个存虚函数指针的指针数组,一般情况这个数组最后面放了一个nullptr。

5. 总结一下派生类的虚表生成:

a.先将基类中的虚表内容拷贝一份到派生类虚表中

b.如果派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数

c.派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后(VS2022,它调试的时候不会显示,但通过手动监视,是可以看见的)。

4_2,多态的原理

上面分析了这个半天了那么多态的原理到底是什么?还记得这里Func函数传Person调用的 Person::BuyTicket,传Student调用的是Student::BuyTicket

子类的指针或者引用向上切片赋值给父类的指针或者引用,包括虚表也是直接切过去,虽然都是父类的指针或者引用,但是他们的虚表是不一样的。

在调用虚函数时,会根据虚表里面的虚函数指针来调用,如果父类的指针/引用实际指向为父类,就会按照父类的虚表里的虚函数指针去调用虚函数;如果父类的指针/引用实际指向为子类,就会按照子类的虚表里的虚函数指针去调用虚函数。

那么多态的原理就很清楚了,子类的指针/引用向上切片赋值给父类,会把虚表也切过去,虚函数的调用是根据虚表里面的虚函数指针,同样是父类的指针/引用,但他们的虚表是不一样的,这个时候去调用虚函数就会产生多态的现象

4_3,动态绑定与静态绑定

1. 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态, 比如:函数重载

2. 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体 行为,调用具体的函数,也称为动态多态。

咱们的多态就到结束啦,咱们下期再见

革命尚未成功,同志仍需努力

相关文章:

C++篇——多态

目录 引言 1&#xff0c;什么是多态 2. 多态的定义及实现 2_1&#xff0c;多态的构成条件 2_2&#xff0c;虚函数 2_3&#xff0c;虚函数的重写 2_4&#xff0c;虚函数重写的两个例外 2_4_1&#xff0c;协变(基类与派生类虚函数返回值类型不同) 2_4_2. 析构函数的重写(基类…...

AI实时对话的通信基础,WebRTC技术综合指南

在通过您的网络浏览器进行音频和视频通话、屏幕共享或实时数据传输时&#xff0c;您可能并不常思考其背后的技术。推动这些功能的核心力量之一就是WebRTC。2011年由谷歌发布的这个开源项目&#xff0c;如今已发展成为一个高度全面且不断扩展的生态系统。尤其是在AI技术大幅突破…...

【寻找Linux的奥秘】第五章:认识进程

请君浏览 前言1. 冯诺依曼体系结构数据流动 2. 操作系统&#xff08;Operating System&#xff09;2.1 概念2.2 设计OS的目的2.3 如何理解“管理”2.4 系统调用和库函数概念 3. 进程3.1 基本概念3.1.1 查看进程3.1.2 创建进程 3.2 进程状态3.2.1 简单介绍3.2.2 运行&&阻…...

uniapp微信小程序-长按按钮百度语音识别回显文字

流程图&#xff1a; 话不多说&#xff0c;上代码&#xff1a; <template><view class"content"><view class"speech-chat" longpress"startSpeech" touchend"endSpeech"><view class"animate-block" …...

支付宝创建商家订单收款码(统一收单线下交易预创建).net开发的软件附带大型XML文件可以删除吗?AlipaySDKNet.OpenAPI.xml

支付宝创建商家订单收款码&#xff08;统一收单线下交易预创建&#xff09;一个程序55MB&#xff0c;XML就带了35MB AlipaySDKNet.OpenAPI.xml&#xff0c;BouncyCastle.Crypto.xml 支付宝店铺收款码创建的程序&#xff0c;这些文件可以不用吗 在支付宝店铺收款码创建的程序中…...

Profinet转Ethernet/IP网关模块通信协议适配配置

案例背景 在某自动化生产车间中&#xff0c;现有控制系统采用了西门子 S7 - 1500 PLC 作为主要控制器&#xff0c;负责生产流程的核心控制。同时&#xff0c;由于部分设备的历史原因&#xff0c;存在使用 AB 的 PLC 进行特定环节控制的情况。为了实现整个生产系统的信息交互与…...

4.6/Q1,GBD数据库最新文章解读

文章题目&#xff1a;Global burden, subtype, risk factors and etiological analysis of enteric infections from 1990-2021: population based study DOI&#xff1a;10.3389/fcimb.2025.1527765 中文标题&#xff1a;1990-2021 年肠道感染的全球负担、亚型、危险因素和病因…...

数字孪生技术:开启未来的“镜像”技术

想象一下&#xff0c;你拥有一个与现实世界一模一样的 “数字分身”&#xff0c;它不仅长得像你&#xff0c;行为举止、思维方式也和你毫无二致&#xff0c;甚至能提前预知你的下一步行动。这听起来像是科幻电影里的情节&#xff0c;但数字孪生技术却让它在现实中成为了可能。数…...

Java 序列化(Serialization)

一、理论说明 1. 序列化的定义 Java 序列化是指将对象转换为字节流的过程&#xff0c;以便将其存储到文件、数据库或通过网络传输。反序列化则是将字节流重新转换为对象的过程。通过实现java.io.Serializable接口&#xff0c;类可以被标记为可序列化的&#xff0c;该接口是一…...

Python解析Excel入库如何做到行的拆分

我们读取解析Excel入库经常会遇到这种场景&#xff0c;那就是行的拆分&#xff0c;如图&#xff1a; 比如我们入库&#xff0c;要以name为主键&#xff0c;可是表格name的值全是以逗号分割的多个&#xff0c;这怎么办呢&#xff1f;这就必须拆成多行了啊。 代码如下&#xff…...

信创国产化监控 | 达梦数据库监控全解析

达梦数据库&#xff08;DM Database&#xff09;是国产数据库的代表产品之一&#xff0c;在政府、金融、电信、能源等多个关键行业应用广泛&#xff0c;它具有高兼容性、高安全性、高可用性、高性能、自主可控等特点。随着国产化替代进程加速&#xff0c;达梦数据库在关键信息基…...

Parsec解决PnP连接失败的问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备环境二、DMZ三、端口映射1.Parsec设置固定端口2.路由器设置端口转发3.重启被控端Parsec四、多少一句1.有光猫管理员账号2.没有光猫管理员账号总结 前言…...

LLM笔记(二)LLM数据基础

核心目标: 构建 LLM 的数据基础&#xff0c;将原始文本转化为模型可处理的、包含丰富语义和结构信息的数值形式。 一、 环境与库准备 (Environment & Libraries): 必要库确认: 在开始之前&#xff0c;确保 torch (PyTorch深度学习框架) 和 tiktoken (OpenAI的高效BPE分词…...

让三个线程(t1、t2、t3)按顺序依次打印 A、B、C

public class ThreadWait {private static final Object lock = new Object();private static boolean t1Output=true;private static boolean t2Output=false;private static boolean t3Output=false;public static void main(String[] args) {//线程1new Thread(new Runnable…...

2、ubantu系统配置OpenSSH | 使用vscode或pycharm远程连接

1、OpenSSH介绍 OpenSSH&#xff08;Open Secure Shell&#xff09;是一套基于SSH协议的开源工具&#xff0c;用于在计算机网络中提供安全的加密通信。它被广泛用于远程系统管理、文件传输和网络服务的安全隧道搭建&#xff0c;是保护网络通信免受窃听和攻击的重要工具。 1.1…...

idea启动报错:java: 警告: 源发行版 11 需要目标发行版 11(亲测解决)

引起原因 idea的jdk没有替换干净 1.配置project file–Project Structrue–Project 2.配置Modules-Sources file–Project Structrue–Modules-Sources 改为jdk11 3.配置Modules-Dependencies file–Project Structrue–Modules-Dependencies...

Pycharm IDEA加载大文件时报错:The file size exceeds configured limit

解决方案&#xff1a;配置一下idea.properties文件 文件里面写入代码&#xff1a; idea.max.intellisense.filesize50000重启IDEA即可&#xff1b;...

视频分辨率增强与自动补帧

一、视频分辨率增强 1.传统分辨率增强方法 传统的视频分辨率增强方法主要基于插值技术。这些方法通过对低分辨率视频帧中已知像素点的分布规律和相邻像素之间的相关性进行分析&#xff0c;在两者之间插入新的像素点以达到增加视频分辨率的目的。例如&#xff0c;最近邻插值算…...

深度学习让鱼与熊掌兼得

通常,一个大的复杂的模型的loss会低,但是拟合方面不够,小的模型在拟合方面更好,但是loss高,我们可以通过深度学习来得到一个有着低loss的小模型 我们之前学过,peacewise linear可以用常数加上一堆这个阶梯型函数得到,然后因为peacewise linear可以逼近任何function,所以理论上…...

面试 Linux 运维相关问题

标题Q1Shell脚本是什么、它是必需的吗? Shell脚本是一种用于自动化执行命令行任务的脚本程序&#xff0c;通常运行在Unix/Linux系统的Shell环境中&#xff08;如Bash&#xff09;。它通过将多个命令、逻辑控制&#xff08;如条件判断、循环&#xff09;和系统功能整合到一个文…...

阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统

在电商行业数据驱动决策的趋势下&#xff0c;高效获取商品详情数据成为企业洞察市场、优化运营的关键。通过阿里巴巴 1688 数据接口构建自动化商品详情采集系统&#xff0c;能够快速、精准地采集海量商品信息。本文将从开发准备、接口分析、代码实现等方面&#xff0c;详细介绍…...

python的宫崎骏动漫电影网站管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

答题pk小程序道具卡的获取与应用

道具卡是答题PK小程序中必不可少的一项增加趣味性的辅助应用&#xff0c;那么道具卡是如何获取与应用的呢&#xff0c;接下来我们来揭晓答案&#xff1a; 一、道具卡的获取&#xff1a; 签到获取&#xff1a;在每日签到中签到不仅可获得当日的签到奖励积分&#xff0c;同时连…...

从零开始创建一个 Next.js 项目并实现一个 TodoList 示例

Next.js 是一个基于 React 的服务端渲染框架&#xff0c;它提供了很多开箱即用的功能&#xff0c;如自动路由、API 路由、静态生成、增量静态再生等。本文将带你一步步创建一个 Next.js 项目&#xff0c;并实现一个简单的 TodoList 功能。 效果地址 &#x1f9f1; 安装 Next.j…...

全面掌握JSR303校验:从入门到实战

一、JSR303校验简介 JSR303是Java EE 6中的一项规范&#xff0c;全称为"Bean Validation 1.0"&#xff0c;它定义了一套基于注解的JavaBean校验机制。通过简单的注解&#xff0c;我们可以优雅地完成参数校验工作&#xff0c;避免在业务代码中编写大量的校验逻辑。 …...

「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(二)

Visual JSF Designer&#xff08;可视化JSF设计器&#xff09;的目标是使创建JSF应用程序的特定于组件工作更容易可视化&#xff0c;在本教程中&#xff0c;您将使用可视化设计器设计JSF登录页面。您将学习如何&#xff1a; 创建一个JSF项目创建一个新的JSF页面设计JSF页面 该…...

Python 翻译词典小程序

一、概述 本工具是基于Python开发的智能翻译系统&#xff0c;采用有道词典进行翻译&#xff0c;并具有本地词典缓存以及单词本功能。 版本号&#xff1a;v1.0 (2025-05-15) 二、核心功能说明 1. 基础翻译功能 即时翻译&#xff1a;输入英文单词自动获取中文释义 词性识别&…...

kafka调优

以下是 Kafka 性能调优的核心策略与参数配置建议&#xff0c;综合生产环境和硬件层面的优化方案&#xff0c;覆盖生产者、消费者、Broker 三个关键组件&#xff1a; 一、生产者调优 批量发送优化 • batch.size&#xff1a;增大批量消息大小&#xff08;默认 16KB&#xff0c;建…...

【hadoop】sqoop案例 hive->mysql

将temperature.log中的气象数据导入到Hive的temperature表中&#xff0c; 根据气象站id分组计算每个气象站30年来的*最高*气温&#xff0c; 然后将统计结果导出到MySQL当中。 思路&#xff1a; 1.在hive中创建表 2.数据导入到表中 3.计算后的结果写入另外的表 4.用sqoop导出…...

Git/GitLab日常使用的命令指南来了!

在 GitLab 中拉取并合并代码的常见流程是通过 Git 命令来完成的。以下是一个标准的 Git 工作流&#xff0c;适用于从远程仓库&#xff08;如 GitLab&#xff09;拉取代码、切换分支、合并更新等操作。 &#x1f310; 一、基础命令&#xff1a;拉取最新代码 # 拉取远程仓库的所…...

遗传算法求解旅行商问题分析

目录 一、问题分析 二、实现步骤 1&#xff09;初始化种群 2&#xff09;计算适应度 3&#xff09;选择操作 4&#xff09;交叉操作 5&#xff09;变异操作 三、求解结果 四、总结 本文通过一个经典的旅行商问题&#xff0c;详细阐述在实际问题中如何运用遗传算法来进…...

【Hadoop】伪分布式安装

【Hadoop】伪分布式安装 什么是 Hadoop 伪分布式安装&#xff1f; Hadoop 伪分布式安装&#xff08;Pseudo-Distributed Mode&#xff09; 是一种在单台机器上模拟分布式集群环境的部署方式。它是介于 本地模式&#xff08;Local Mode&#xff09; 和 完全分布式模式&#xf…...

微服务概述

什么是微服务 微服务是一个架构方案,属于分布式架构的一种。 微服务提倡将模块以独立服务的方式独立管理,整个项目依靠多个小型的服务(单独进程)同时运作来支撑,单个服务只关注自己的业务实现并且有专业的团队进行开发。服务之间使用轻量的协议进行消息传送,并且对于单个…...

【网工】华为配置基础篇①

目录 ■华为设备登录配置 ■VLAN与VLANIF地址配置 ■DHCP配置命令 ■ACL访问控制列表配置 ■NAT地址转换配置 ■华为设备登录配置 <AR> system-view //进入系统模式 [AR]sysname Huawei //设备命名为Huawei [Huawei] telnet server enable //开启设备telnet功…...

React19源码系列之 Diff算法

在之前文章中root.render执行的过程&#xff0c;beginWork函数是渲染过程的核心&#xff0c;其针对不同类型的fiber进行不同的更新处理&#xff0c;在FunctionComponent&#xff08;函数组件&#xff09;中&#xff0c;会针对新旧fiber进行对比处理生成新fiber。因此此次就详细…...

华为2024年报:鸿蒙生态正在取得历史性突破

华为于2025年03月31日发布2024年年度报告。报告显示&#xff0c;华为经营结果符合预期&#xff0c;实现全球销售收入 8,621 亿元人民币&#xff0c;净利润 626 亿元人民币。2024 年研发投入达到 1,797 亿元人民币&#xff0c;约占全年收入的 20.8%&#xff0c;近十年累计投入的…...

如何在Firefox火狐浏览器里-安装梦精灵AI提示词管理工具

第一步&#xff1a;进入《梦精灵跨平台AI提示词管理工具》官网 梦精灵 跨平台AI提示词管理助手 - 官网梦精灵是一款专为AI用户打造的跨平台提示词管理插件&#xff0c;支持一键收藏、快速复制、智能分类等功能&#xff0c;适用于即梦、豆包、Kimi、DeepSeek等多个AI平台&…...

【鸿蒙开发】性能优化

语言层面的优化 使用明确的数据类型&#xff0c;避免使用模糊的数据类型&#xff0c;例如ESObject。 使用AOT模式 AOT就是提前编译&#xff0c;将字节码提前编译成机器码&#xff0c;这样可以充分优化&#xff0c;从而加快执行速度。 未启用AOT时&#xff0c;一边运行一边进…...

Makefile与CMake

一、Makefile 核心内容 1. Makefile 基础结构与工作原理 三要素&#xff1a; 目标&#xff08;Target&#xff09;&#xff1a;要生成的文件或执行的操作&#xff08;如可执行文件、清理操作&#xff09;。依赖&#xff08;Dependency&#xff09;&#xff1a;生成目标所需的…...

P8803 [蓝桥杯 2022 国 B] 费用报销

P8803 [蓝桥杯 2022 国 B] 费用报销 - 洛谷 题目描述 小明在出差结束后返回了公司所在的城市&#xff0c;在填写差旅报销申请时&#xff0c;粗心的小明发现自己弄丢了出差过程中的票据。 为了弥补小明的损失&#xff0c;公司同意小明用别的票据进行报销&#xff0c;但是公司财…...

11 web 自动化之 DDT 数据驱动详解

文章目录 一、DDT 数据驱动介绍二、实战 一、DDT 数据驱动介绍 数据驱动&#xff1a; 现在主流的设计模式之一&#xff08;以数据驱动测试&#xff09; 结合 unittest 框架如何实现数据驱动&#xff1f; ddt 模块实现 数据驱动的意义&#xff1a; 通过不同的数据对同一脚本实现…...

15:00开始面试,15:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到4月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

深入理解浏览器渲染引擎:底层机制与性能优化实战

现代浏览器背后是一个庞大而复杂的系统工程&#xff0c;渲染引擎作为核心模块之一&#xff0c;承担着从解析 HTML/CSS 到最终绘制页面的关键职责。本文将从底层机制出发&#xff0c;系统梳理渲染引擎&#xff08;如 Blink&#xff09;工作原理、V8 与渲染流程的协作方式&#x…...

【LeetCode 热题 100】56. 合并区间 —— 一文弄懂排序+遍历经典解法(附Python代码)

📌 题目链接 LeetCode 56. 合并区间 📖 一、引言:区间合并,刷题路上的绊脚石? 区间类问题是算法面试中常见的经典题型,尤其是“合并区间”问题,考察你对排序、区间重叠判断及边界处理的理解和编码能力。 很多同学在面对这题时,容易卡在: 什么时候两个区间算重叠?…...

使用Mathematica绘制Clifford奇异吸引子

Clifford Attractors 是一种由微分方程 生成的混沌吸引子&#xff0c;参数a,b,c,d不同会产生不同的分形图案。这类吸引子属于迭代函数系统&#xff0c;通过不断迭代参数方程来生成复杂的图形。其数学基础可能与 Clifford 代数或高维函数理论相关&#xff0c;例如 Clifford 代数…...

各个历史版本mysql/tomcat/Redis/Jdk/Apache下载地址

mysql 各版本下载地址&#xff1a; https://downloads.mysql.com/archives/community/ **************************************************************** tomcat 各版本下载地址&#xff1a; https://archive.apache.org/dist/tomcat/ ********************************…...

全面解析机器学习与深度学习中的模型权重文件格式与应用场景

概述 随着机器学习和人工智能技术的飞速发展&#xff0c;高效且安全地存储、共享和部署训练有素的模型的方法变得越来越重要。模型权重文件格式在这个过程中发挥着关键作用。这些格式不仅保存了模型的学习参数&#xff0c;还能够实现可复现性&#xff0c;并且便于在各种不同环…...

鸿蒙OSUniApp 实现的地图定位与导航功能#三方框架 #Uniapp

UniApp 实现的地图定位与导航功能 随着移动互联网的发展&#xff0c;地图定位与导航功能已成为众多应用的标配。本文将详细介绍如何在 UniApp 框架下实现地图定位与导航功能&#xff0c;并探讨如何适配鸿蒙系统&#xff0c;助力开发者打造更加流畅的地图体验。 前言 最近在做一…...

【HarmonyOS 5】鸿蒙星闪NearLink详解

【HarmonyOS 5】鸿蒙星闪NearLink详解 一、前言 鸿蒙星闪NearLink Kit 是 HarmonyOS 提供的短距离通信服务&#xff0c;支持星闪设备间的连接、数据交互。例如&#xff0c;手机可作为中心设备与外围设备&#xff08;如鼠标、手写笔、智能家电、车钥匙等&#xff09;通过星闪进…...

Java并发编程面试题总结

目录 线程有哪几种状态?状态如何流转? 创建线程的方式? 多线程有什么应用? 线程池的好处? 线程池的七个参数? 为什么不推荐使用jdk的Executors创建线程池? 线程池的执行流程? 任务拒绝策略有哪些&#xff0c;怎么选择? 线程池的核心线程数和最大线程数怎么设定…...