C++核心编程之类和对象---C++面向对象的三大特性--多态
目录
一、多态
1. 多态的概念
2.多态的分类:
1. 静态多态:
2. 动态多态:
3.静态多态和动态多态的区别:
4.动态多态需要满足的条件:
4.1重写的概念:
4.2动态多态的调用:
二、多态
三、多态的深入剖析
四、利用多态写一个模拟计算器案例
1.普通方式写一个模拟计算器
2.利用多态的方式写一个计算器
五、纯虚函数和抽象类
抽象类特点:
六、利用多态的抽象类写一个饮品制作流程的案例
七、纯析构和纯虚析构
虚析构和纯虚析构的共性:
虚析构和纯虚析构的区别:
总结:
八、利用多态写一个组装电脑的案例
一、多态
1. 多态的概念
计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
多态也可定义为“一种将不同的特殊行为和单个泛化记号相关联的能力”。
多态可分为变量多态与函数多态。变量多态是指:基类型的变量(对于C++是引用或指针)可以被赋值基类型对象,也可以被赋值派生类型的对象。函数多态是指,相同的函数调用界面(函数名与实参表),传送给一个对象变量,可以有不同的行为,这视该对象变量所指向的对象类型而定。因此,变量多态是函数多态的基础。
多态是c++面向对象的三大特性之一
2.多态的分类:
1. 静态多态:
函数重载 和 运算符重载 属于静态多态,复用函数名
静态多态(static polymorphism):模板也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为“静态”。可以用来实现类型安全、运行高效的同质对象集合操作。C++STL不采用动态多态来实现就是个例子。
-
函数重载(Function Overloading)
-
运算符重载(Operator Overloading)
-
带变量的宏多态(macro polymorphism)
-
非参数化多态或译作特设多态(Ad-hoc polymorphism):
-
参数化多态(Parametric polymorphism):把类型作为参数的多态。在面向对象程序设计中,这被称作泛型编程。
2. 动态多态:
派生类 和 虚函数 实现运行时多态
动态多态(dynamic polymorphism):通过类继承机制和虚函数机制生效于运行期。可以优雅地处理异质对象集合,只要其共同的基类定义了虚函数的接口。也被称为子类型多态(Subtype polymorphism)或包含多态(inclusion polymorphism)。在面向对象程序设计中,这被直接称为多态。
对于C++语言,带变量的宏和函数重载(function overload)机制也允许将不同的特殊行为和单个泛化记号相关联。然而,习惯上并不将这种函数多态(function polymorphism)、宏多态(macro polymorphism)展现出来的行为称为多态(或静态多态),否则就连C语言也具有宏多态了。谈及多态时,默认就是指动态多态,而静态多态则是指基于模板的多态。
3.静态多态和动态多态的区别:
1. 静态多态的函数地址早绑定,编译阶段确定函数地址
2. 动态多态的函数地址晚绑定,运行阶段确定函数地址
4.动态多态需要满足的条件:
1.有继承关系
2.子类中重写父类的虚函数(子类中写不写virtual都可以)
4.1重写的概念:
函数返回值类型 函数名 参数列表都完全相同。
注意:与函数重载要区分。
4.2动态多态的调用:
父类的指针或引用 执行子类对象
二、多态
示例:
#include<iostream>using namespace std;// 多态// 动态多态的满足条件// 1. 有继承关系// 2. 子类要重写父类的虚函数// 动态多态的使用// 父类的指针或引用 指向子类对象// 动物类class Animal{public:// 虚函数virtual void speak(){cout<<"动物在说话"<<endl;}};// 猫类class Cat:public Animal{public:// 重写 函数返回值类型 函数名 参数列表要 完全相同void speak(){cout<<"猫在说话"<<endl;}};// 狗类class Dog:public Animal{public:void speak(){cout<<"狗在说话"<<endl;}};// 执行说话的函数void dospeak(Animal &animal) // Animal & animal = cat;{// 地址早绑定 在编译阶段确定函数地址// 如果要执行猫说话,那么这个函数地址就不能提前绑定// 需要在运行阶段进行绑定,地址晚绑定animal.speak();}// c++允许父类和子类的转化void test01(){Cat cat;// cat.speak();dospeak(cat); // 父类的引用,接收的是子类的对象Dog dog;dospeak(dog);}int main(){test01();return 0;}
没写 virtual 之前是地址早绑定

写入虚函数后,地址晚绑定运行结果:

三、多态的深入剖析
图解示例:

示例:
#include<iostream>using namespace std;// 多态的底层逻辑// 动物类class Animal{public:// 虚函数void speak(){cout << "动物在说话" << endl;}};// 猫类class Cat :public Animal{public:// 重写 函数返回值类型 函数名 参数列表要 完全相同void speak(){cout << "猫在说话" << endl;}};// 狗类class Dog :public Animal{public:void speak(){cout << "狗在说话" << endl;}};// 执行说话的函数void dospeak(Animal& animal){// 地址早绑定 在编译阶段确定函数地址// 如果要执行猫说话,那么这个函数地址就不能提前绑定// 需要在运行阶段进行绑定,地址晚绑定animal.speak();}// c++允许父类和子类的转化void test01(){Cat cat;// cat.speak();dospeak(cat); // 父类的引用,接收的是子类的对象Dog dog;dospeak(dog);}void test02(){cout << "Animal 类的大小:" << sizeof(Animal) << endl;}int main(){test01();test02();return 0;}
通过命令提示符查看

加入虚函数后

子类在没有重写的时候

子类重写虚函数后

没加virtual的类的大小,相当于空类,大小是1

变为虚函数后的类的大小为8/4(看你的编译器是多少位的),类的大小是一个指针的大小

关于命令提示符查看类可查询上一篇文章:命令提示符查看类
四、利用多态写一个模拟计算器案例
多态的优点:
- 代码组织结构清晰
- 可读性强
- 利于前期和后期的扩展及维护
1.普通方式写一个模拟计算器
示例1:
#include<iostream>using namespace std;// 分别利用普通写法和多态的技术实现计算器的功能// 普通的写法class Calculator{public:int get_result(string oper){if(oper == "+")return m_num1+m_num2;if(oper == "-")return m_num1 - m_num2;if(oper == "*")return m_num1 * m_num2;if(oper == "/")return m_num1 / m_num2;}int m_num1;int m_num2;};void test01(){Calculator c;c.m_num1 = 40;c.m_num2 = 20;// 开闭原则,对扩展进行开放,对修改进行关闭cout<<c.m_num1<<" + "<<c.m_num2<<" = "<<c.get_result("+")<<endl;cout<<c.m_num1<<" - "<<c.m_num2<<" = "<<c.get_result("-")<<endl;cout<<c.m_num1<<" * "<<c.m_num2<<" = "<<c.get_result("*")<<endl;cout<<c.m_num1<<" / "<<c.m_num2<<" = "<<c.get_result("/")<<endl;}int main(){test01();return 0;}
运行结果:

2.利用多态的方式写一个计算器
示例2:
#include<iostream>using namespace std;// 利用多态实现计算器class Abstract_Calculator{public:virtual int get_result(){return 0;}int num1;int num2;};// 设计一个加法计算器的类class Add_Calculator:public Abstract_Calculator{public:int get_result(){return num1+num2;}};// 设计一个减法计算器的类class Sub_Calculator:public Abstract_Calculator{public:int get_result(){return num1-num2;}};// 设计一个乘法计算器的类class Mul_Calculator:public Abstract_Calculator{public:int get_result(){return num1*num2;}};void test02(){// 多态的使用条件// 父类的指针或引用指向子类对象// 加法运算Abstract_Calculator *abc = new Add_Calculator;abc->num1 = 100;abc->num2 = 200;cout<<abc->num1<<" + "<<abc->num2<<" = "<<abc->get_result()<<endl;// 堆区数据用完记得销毁delete abc;// 减法运算abc = new Sub_Calculator;abc->num1 = 200;abc->num2 = 100;cout<<abc->num1<<" - "<<abc->num2<<" = "<<abc->get_result()<<endl;delete abc;// 乘法运算abc = new Mul_Calculator;abc->num1 = 200;abc->num2 = 100;cout<<abc->num1<<" * "<<abc->num2<<" = "<<abc->get_result()<<endl;delete abc;}int main(){test02();return 0;}
运行结果:

五、纯虚函数和抽象类
在多态中,通常父类中虚函数的实现是毫无意义的,主要是调用子类的重写内容
因此可以将虚数改为纯虚数
纯虚数语法: virtual 返回值类型 函数名(参数列表) = 0 ;
当类中有了纯虚函数,这个类称为抽象类
抽象类特点:
- 无法实例化对象
- 子类必须重写抽象类中的纯虚函数,否则也属于抽象类
示例:
#include<iostream>using namespace std;// 纯虚数抽象类class Base{public:virtual void func() = 0; // 虚函数的基础上才可以等于0,纯虚函数// 只要有一个纯虚数,这个类称为抽象类};// 抽象类的子类,必须要重写父类中的纯虚函数,否则也是抽象类,无法实例化对象class Son:public Base{public:void func(){cout<<"func函数调用"<<endl;}};void test01(){// Base b; 无法实例化一个抽象类// new 一个也不行Base *base = new Son;base->func();}int main(){test01();return 0;}
运行结果:

六、利用多态的抽象类写一个饮品制作流程的案例
案例描述:利用多态技术,提供抽象类制作饮品基类,提供子类制作咖啡和茶叶
示例:
#include<iostream>using namespace std;class Abstract_Drinking{public:// 煮水virtual void Boil() = 0;// 冲泡virtual void Brew() = 0;// 倒入杯中virtual void Pour_Cup() = 0;// 加入辅助佐料virtual void Put_something() = 0;// 制作饮品void make_drink(){Boil();Brew();Pour_Cup();Put_something();}};// 具体的制作// 咖啡class Coffee:public Abstract_Drinking{public:// 煮水virtual void Boil(){cout<<"煮矿泉水"<<endl;}// 冲泡virtual void Brew(){cout<<"冲泡咖啡"<<endl;}// 倒入杯中virtual void Pour_Cup(){cout<<"倒入杯中"<<endl;}// 加入辅助佐料virtual void Put_something(){cout<<"加入糖和牛奶"<<endl;}};// 茶class Tea:public Abstract_Drinking{public:// 煮水virtual void Boil(){cout<<"煮矿泉水"<<endl;}// 冲泡virtual void Brew(){cout<<"冲泡茶叶"<<endl;}// 倒入杯中virtual void Pour_Cup(){cout<<"倒入杯中"<<endl;}// 加入辅助佐料virtual void Put_something(){cout<<"加入柠檬,枸杞"<<endl;}};// 制作void do_work(Abstract_Drinking * abd)// Abstract_Drinking *abd = new Coffee 父类指针指向子类对象{abd->make_drink();delete abd;// 在堆区制作完记得释放}void test01(){// 制作咖啡do_work(new Coffee);cout<<"-------------"<<endl;// 制作茶do_work(new Tea);}int main(){test01();return 0;}
运行结果:

七、纯析构和纯虚析构
问题:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。
解决办法:将父类中的析构函数改为**虚析构**或者**纯虚析构**
虚析构和纯虚析构的共性:
- 可以解决父类指针释放子类对象
- 都需要有具体的函数实现
虚析构和纯虚析构的区别:
- 如果是纯虚析构,该对象属于抽象类,无法实现实例化对象
**虚析构语法:**
virtual ~类名(){}
**纯虚析构语法:**
virtual ~类名()= 0;
类名::~类名(){} // 类内声明,类外实现
示例:
#include<iostream>using namespace std;// 虚析构和纯虚析构class Animal{public:Animal(){cout<<"Animal的构造函数的调用"<<endl;}virtual void speak() = 0;// 变为纯虚函数// 利用虚析构可以解决 父类指针释放子类对象时不干净的问题/*virtual ~Animal(){cout<<"Animal虚析构函数的调用"<<endl;}*/virtual ~Animal() = 0;// 纯虚析构// 需要声明 也需要实现// 有了纯虚析构之后,那么这个类也属于抽象类,无法实现实例化对象};Animal::~Animal(){cout<<"Animal纯虚析构函数的调用"<<endl;}class Cat: public Animal{public:Cat(string name){cout<<"这是Cat的构造函数的调用"<<endl;this->name = new string(name);}void speak(){cout<<*name<<"小猫在说话"<<endl;}~Cat(){if(this->name!=NULL){cout<<"这是Cat的析构函数的调用"<<endl;delete this->name;this->name = NULL;}}string *name;// 创建在堆区};void test01(){Animal *animal = new Cat("Tom");animal->speak();// 父类的指针在析构的时候不会调用子类的析构函数// 导致子类如果在堆区有数据,会出现内存泄漏的情况delete animal;}int main(){test01();return 0;}
运行结果:

总结:
- 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
- 如果子类中没有堆区数据,可以不写为虚析构或者纯虚析构
- 拥有纯虚析构函数的类也属于抽象类
八、利用多态写一个组装电脑的案例
案例说明:
电脑主要组成部件为CPU(用于计算),显卡〔用于显示),内存条〔用于存储)
将每个零件封装出抽象基类,并且提供不同的厂商生产不同的霉件,例如Intel厂商和Lenovo厂商
创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口
测试时组装三台下同的电脑进行工作
示例:
#include<iostream>using namespace std;// 抽象不同零件的类// 计算机类class CPU{public:// 抽象的计算函数virtual void calculate() = 0;};// 显卡类class Video_Card{public:// 抽象的显示函数virtual void display() = 0;};// 内存条类class Memory{public:// 抽象的存储函数virtual void storage() = 0;};// 提供电脑类class Computer{public:Computer(CPU* cpu, Video_Card* vc, Memory* mem){this->cpu = cpu;this->vc = vc;this->mem = mem;}// 提供工作函数void work(){// 让零件工作起来,调用接口this->cpu->calculate();this->vc->display();this->mem->storage();}// 提供析构函数 释放在堆区创建的三个零件~Computer(){if(cpu!=NULL){delete cpu;cpu = NULL;}if(vc!=NULL){delete vc;vc = NULL;}if(mem!=NULL){delete mem;mem = NULL;}}private:CPU* cpu; // CPU的零件指针Video_Card* vc; // 显卡的零件指针Memory* mem; // 内存条的零件指针};// 具体厂商// Intel厂商// CPUclass Intel_CPU :public CPU{public:void calculate(){cout << "这是Intel厂商的CPU,并且开始计算了" << endl;}};// 显卡class Intel_Video_Card :public Video_Card{public:void display(){cout << "这是Intel厂商的显卡,并且开始显示了" << endl;}};// 内存条class Intel_Memory :public Memory{void storage(){cout << "这是Intel厂商的内存条,并且开始存储了" << endl;}};// Lenovo厂商// CPUclass Lenovo_CPU :public CPU{public:void calculate(){cout << "这是Lenovo厂商的CPU,并且开始计算了" << endl;}};// 显卡class Lenovo_Video_Card :public Video_Card{public:void display(){cout << "这是Lenovo厂商的显卡,并且开始显示了" << endl;}};// 内存条class Lenovo_Memory :public Memory{void storage(){cout << "这是Lenovo厂商的内存条,并且开始存储了" << endl;}};void test01(){cout<<"------------------------"<<endl;cout<<"第一台电脑开始工作"<<endl;// 创建第一台电脑的零件CPU* intel_CPU = new Intel_CPU;Video_Card* intel_videocard = new Intel_Video_Card;Memory* intel_memory = new Intel_Memory;// 创建电脑零件的时候时在堆区创建的// 创建第一台电脑Computer* computer1 = new Computer(intel_CPU, intel_videocard, intel_memory);computer1->work();delete computer1;cout<<"-----------------------"<<endl;cout<<"第二台电脑开始工作"<<endl;// 组装第二台电脑Computer* computer2 = new Computer(new Lenovo_CPU, new Lenovo_Video_Card, new Lenovo_Memory);computer2->work();delete computer2;cout<<"-----------------------"<<endl;cout<<"第三台电脑开始工作"<<endl;// 组装第三台电脑Computer* computer3 = new Computer(new Lenovo_CPU, new Intel_Video_Card, new Lenovo_Memory);computer3->work();delete computer3;}int main(){test01();return 0;}
运行结果:

相关文章:
C++核心编程之类和对象---C++面向对象的三大特性--多态
目录 一、多态 1. 多态的概念 2.多态的分类: 1. 静态多态: 2. 动态多态: 3.静态多态和动态多态的区别: 4.动态多态需要满足的条件: 4.1重写的概念: 4.2动态多态的调用: 二、多态 三、多…...
基于PyQT的图片批处理系统
项目背景: 随着数字摄影技术的普及,人们拍摄和处理大量图片的需求也越来越高。为了提高效率,开发一个基于 PyQt 的图片批处理系统是很有意义的。该系统可以提供一系列图像增强、滤波、水印、翻转、放大缩小、旋转等功能,使用户能够…...
vscode文件配置
lanuch.json {"version": "0.2.0","configurations": [{"name": "(gdb) 启动","type": "cppdbg","request": "launch",// "program": "输入程序名称,例…...
C++学习笔记——SLT六大组件及头文件
目录 一、C中STL(Standard Template Library) 二、 Gun源代码开发精神 三、 实现版本 四、GNU C库的头文件分布 bits目录 ext目录 backward目录 iostream目录 stdexcept目录 string目录 上一篇文章: C标准模板库(STL&am…...
Spring之AOP源码(二)
书接上文 文章目录 一、简介1. 前文回顾2. 知识点补充 二、ProxyFactory源码分析1. ProxyFactory2. JdkDynamicAopProxy3. ObjenesisCglibAopProxy 三、 Spring AOP源码分析 一、简介 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理,但是还没有涉…...
VS code console.log快捷键设置 :console.log(‘n>>>‘,n)
vscode设置log快捷显示: 一、打开 VS Code,并进入菜单栏选择 “文件”(File)-> “首选项”(Preferences)-> “用户代码片段”(User Snippets)。 二、在弹出的下拉菜单中选择 …...
ZooKeeper 简介
1、概念介绍 ZooKeeper 是一个开放源码的分布式应用程序协调服务,为分布式应用提供一致性服务的软件,由雅虎创建,是 Google Chubby 的开源实现,是 Apache 的子项目,之前是 Hadoop 项目的一部分,使用 Java …...
rke2 Online Deploy Rancher v2.8.0 latest (helm 在线部署 rancher v2.8.0)
文章目录 1. 简介2. 预备条件3. 安装 helm4. 安装 cert-manager4.1 yaml 安装4.2 helm 安装 5. 安装 rancher6. 验证7. 界面预览 1. 简介 Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托…...
k8s实战从入门到上天系列第一篇:K8s微服务实战内容开篇介绍
前言 我们使用开源ruoyi微服务基本使用,基于基本的微服务实践。我们来讲解k8s的实战内容。 第一章:开源ruoyi微服务简介基本使用 第二章:k8s基本知识回顾、k3s集群搭建和基本使用 第三章:微服务镜像构建 第四章:中间件…...
统一网关 Gateway【微服务】
文章目录 1. 前言2. 搭建网关服务3. 路由断言工厂4. 路由过滤器4.1 普通过滤器4.2 全局过滤器4.3 过滤器执行顺序 5. 跨域问题处理 1. 前言 通过前面的学习我们知道,通过 Feign 就可以向指定的微服务发起 http 请求,完成远程调用。但是这里有一个问题&am…...
【征服redis1】基础数据类型详解和应用案例
博客计划 ,我们从redis开始,主要是因为这一块内容的重要性不亚于数据库,但是很多人往往对redis的问题感到陌生,所以我们先来研究一下。 本篇,我们先看一下redis的基础数据类型详解和应用案例。 1.redis概述 以mysql为…...
【WPF.NET开发】WPF中的XAML资源
本文内容 使用 XAML 中的资源静态和动态资源静态资源动态资源样式、DataTemplate 和隐式键 资源是可以在应用中的不同位置重复使用的对象。 资源的示例包括画笔和样式。 本概述介绍如何使用 Extensible Application Markup Language (XAML) 中的资源。 你还可以使用代码创建和…...
ChatGPT 淘金潮(全)
原文:The ChatGPT GoldRush 译者:飞龙 协议:CC BY-NC-SA 4.0 一、ChatGPT 简介 什么是 ChatGPT? ChatGPT 是由 OpenAI 基于 GPT-4 架构创建的大型语言模型。它旨在理解和回应自然语言文本输入,使得可以与机器进行对话…...
【零基础入门Python数据分析】Anaconda3 JupyterNotebookseaborn版
目录 一、安装环境 python介绍 anaconda介绍 jupyter notebook介绍 anaconda3 环境安装 解决JuPyter500:Internal Server Error问题-CSDN博客 Jupyter notebook快捷键操作大全 二、Python基础入门 数据类型与变量 数据类型 变量及赋值 布尔类型与逻辑运算…...
C++面试:单例模式、工厂模式等简单的设计模式 创建型、结构型、行为型设计模式的应用技巧
理解和能够实现基本的设计模式是非常重要的。这里,我们将探讨两种常见的设计模式:单例模式和工厂模式,并提供一些面试准备的建议。 目录 单例模式 (Singleton Pattern) 工厂模式 (Factory Pattern) 面试准备 1. 理解设计模式的基本概念…...
Oracle JDK 8 中的 computeIfAbsent 方法及实践
Java 8 引入了一系列新特性,其中之一是对 Map 接口的增强,其中包括了 computeIfAbsent 方法。这个方法为处理映射提供了一种便捷而强大的方式,允许在键不存在或对应的值为 null 时,动态计算新的值并将其放入映射。在本篇博客中&am…...
华为设备vlan下配置MSTP,STP选举
核心代码,不同实例,承载不同流量,为每个实例设置一个根网桥达到分流的效果 stp region-config //进入stp区域的设置 region-name R1 //区域命名为R1 instance 1 vlan 10 …...
案例学Python:filter()函数的用法,高级!
大家好,这里是程序员晚枫,又来分享有用的Python知识了。 Python之所以好用,是因为有大量用于科学计算的内置函数和第三方库。用好这些第三方库,可以显著提高我们编程的速度和质量。 今天我们一起来看一下Python中一个重要的内置…...
jmeter--7.BeanShell
目录 1. beanshell常用语法 1.1 log:日志写入 1.2 vars:设置和引用局部变量(同线程组) 1.3 props:设置和引用全局变量(跨线程组) 1.4 prev:获取前一个请求返回的信息 2. beans…...
第 3 场 蓝桥杯小白入门赛 解题报告 | 珂学家 | 单调队列优化的DP + 三指针滑窗
前言 整体评价 T5, T6有点意思,这场小白入门场,好像没真正意义上的签到,整体感觉是这样。 A. 召唤神坤 思路: 前后缀拆解 #include <iostream> #include <algorithm> #include <vector> using namespace std;int main()…...
UE5.4.4视频不导入实战:绕过Content Browser直连文件系统
1. 为什么在UE5.4.4里“不导入视频”反而成了刚需?在UE5.4.4项目现场,我最近连续被三个不同团队问到同一个问题:“能不能别把视频拖进Content Browser?”——不是他们不会操作,而是一拖进去就出事。美术同事导了个2.7G…...
初创公司如何利用Taotoken快速构建多模型AI应用原型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创公司如何利用Taotoken快速构建多模型AI应用原型 对于资源有限的初创团队而言,验证一个AI产品想法的关键在于速度与…...
Autodesk Fusion 360 Linux终极指南:在Ubuntu上运行专业3D建模软件
Autodesk Fusion 360 Linux终极指南:在Ubuntu上运行专业3D建模软件 【免费下载链接】Autodesk-Fusion-360-for-Linux This is a project, where I give you a way to use Autodesk Fusion 360 on Linux! 项目地址: https://gitcode.com/gh_mirrors/au/Autodesk-Fu…...
流程管理系统中的form-create应用:条件渲染与动态权限控制终极指南
流程管理系统中的form-create应用:条件渲染与动态权限控制终极指南 【免费下载链接】FormCreate 🔥🔥🔥 强大的低代码动态表单组件,通过JSON数据驱动表单渲染,适配移动端,支持可视化设计。提高开…...
高效网络资源捕获工具res-downloader完全指南:从入门到精通
高效网络资源捕获工具res-downloader完全指南:从入门到精通 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否…...
心理学论文降AI工具免费推荐:2026年心理学毕业论文知网维普降AI4.8元亲测完整方案
心理学论文降AI工具免费推荐:2026年心理学毕业论文知网维普降AI4.8元亲测完整方案 答辩前夕,AI率36%,学校要求15%以下。 用嘎嘎降AI(www.aigcleaner.com),4.8元,两小时搞定,一次过…...
如何快速构建数学可视化:Manim交互式开发完整教程
如何快速构建数学可视化:Manim交互式开发完整教程 【免费下载链接】manim Animation engine for explanatory math videos 项目地址: https://gitcode.com/GitHub_Trending/ma/manim 想要告别数学动画制作中反复修改代码、重新渲染的烦恼吗?&…...
解锁ARM64虚拟化潜能:Proxmox VE在ARM平台的完整部署与优化实战
解锁ARM64虚拟化潜能:Proxmox VE在ARM平台的完整部署与优化实战 【免费下载链接】Proxmox-Arm64 Proxmox VE & PBS unofficial arm64 version 项目地址: https://gitcode.com/gh_mirrors/pr/Proxmox-Arm64 你是否曾经想过在树莓派、Rockpi或鲲鹏服务器上…...
阿里云DataV技术
DataV是什么:阿里云DataV是一个企业级数据可视化应用搭建平台,核心定位是让用户通过图形化界面(拖拽组件、配置数据),快速搭建出专业水准的大屏可视化应用。它特别适合会议展览、业务监控、风险预警、地理信息分析等需…...
通过Taotoken的CLI工具一键配置开发环境与API密钥
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken的CLI工具一键配置开发环境与API密钥 对于需要接入多个大模型服务的开发团队而言,统一管理API密钥和端点配…...
