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

C++多态与虚函数详解——从入门到精通

C++多态与虚函数详解——从入门到精通

引言

在C++面向对象编程中,多态是一个核心概念,它赋予了程序极大的灵活性和扩展性。本文将通过六个精心设计的实例,深入浅出地讲解C++中的多态、虚函数、继承和抽象类等概念,帮助初学者快速理解这些重要的面向对象特性。

一、基本多态实现

#include <iostream>
using namespace std;class Base {
public:// 虚函数声明,使得派生类可以重写该函数virtual void show() { cout << "Base" << endl; }  // 基类的show方法
};class Derived : public Base {
public:// override关键字明确表示这是对基类虚函数的重写void show() override { cout << "Derived" << endl; }  // 派生类重写show方法
};int main() {// 关键点:基类指针指向派生类对象Base* b = new Derived();  // 基类指针指向派生类对象b->show();  // 调用的是派生类的show方法,输出"Derived"delete b;   // 释放内存return 0;
}

代码解析:

  • 这个例子展示了C++多态的基础实现。通过在基类中声明virtual函数,并在派生类中重写该函数。
  • 当使用基类指针指向派生类对象并调用虚函数时,会根据指针实际指向的对象类型调用相应的函数实现。
  • 这里输出结果为Derived,展示了动态绑定的特性。

二、虚函数与普通函数的区别

#include <iostream>
using namespace std;class A {
public:// 虚函数会根据对象的实际类型动态绑定virtual void func() { cout << "A::func" << endl; }  // 虚函数// 普通函数根据指针或引用的静态类型绑定void test() { cout << "A::test" << endl; }  // 非虚函数
};class B : public A {
public:// 重写基类的虚函数void func() override { cout << "B::func" << endl; }  // 重写虚函数// 这不是重写,而是隐藏基类的同名函数void test() { cout << "B::test" << endl; }  // 隐藏基类的同名函数
};int main() {A* obj = new B();  // 基类指针指向派生类对象obj->func();  // 调用B::func,体现多态obj->test();  // 调用A::test,静态绑定delete obj;return 0;
}

代码解析:

  • 这个例子清晰地展示了虚函数与普通函数在多态场景中的区别。
  • func()是虚函数,会根据对象的实际类型动态绑定,因此输出B::func
  • test()是普通函数,根据指针的静态类型绑定,因此输出A::test
  • 这个区别是C++多态机制的核心,明确理解这一点对掌握多态至关重要。

三、多层继承中的虚函数

#include <iostream>
using namespace std;class Grandparent {
public:// 在最顶层基类声明虚函数virtual void foo() { cout << "Grandparent::foo" << endl; }  // 祖父类的虚函数
};class Parent : public Grandparent {
public:// 中间层重写虚函数void foo() override { cout << "Parent::foo" << endl; }  // 父类重写虚函数
};class Child : public Parent {
public:// 最下层再次重写虚函数void foo() override { cout << "Child::foo" << endl; }  // 子类重写虚函数
};int main() {// 祖父类指针指向孙子类对象Grandparent* gp = new Child();  // 基类指针指向最终派生类gp->foo();  // 调用的是Child::foo,体现多态特性delete gp;return 0;
}

代码解析:

  • 这个例子展示了多层继承中的虚函数工作机制。
  • 虚函数一旦在基类中声明为virtual,在整个继承链中都保持虚函数的特性。
  • 即使使用最顶层的基类指针,只要指向的是子类对象,调用虚函数时会一直追踪到最终的实现。
  • 输出结果为Child::foo,展示了多层继承中的动态绑定特性。

四、虚析构函数的重要性

#include <iostream>
using namespace std;class Base {
public:// 虚析构函数确保正确析构派生类对象virtual ~Base() { cout << "Base destructor" << endl; }  // 虚析构函数
};class Derived : public Base {
public:// 派生类的析构函数~Derived() { cout << "Derived destructor" << endl; }  // 派生类析构函数
};int main() {Base* b = new Derived();  // 基类指针指向派生类对象delete b;  // 会先调用Derived的析构函数,再调用Base的析构函数return 0;
}

代码解析:

  • 这个例子展示了虚析构函数的重要性。
  • 当使用基类指针删除派生类对象时,如果析构函数不是虚函数,则只会调用基类的析构函数,可能导致派生类资源泄漏。
  • 有了虚析构函数,delete操作会先调用派生类的析构函数,再调用基类的析构函数,确保资源被正确释放。
  • 输出顺序为:Derived destructor然后是Base destructor,体现了对象销毁的正确顺序。

五、多重继承中的析构顺序

#include <iostream>
using namespace std;class A {
public:// A的虚析构函数virtual ~A() {cout << "A destructor" << endl;  // A类析构函数}
};class B {
public:// B的虚析构函数virtual ~B() {cout << "B destructor" << endl;  // B类析构函数}
};class C : public A, public B {
public:// C的析构函数~C() {cout << "C destructor" << endl;  // C类析构函数}
};int main() {A* a = new C();  // A类型指针指向C类对象delete a;  // 析构函数调用次序:C->A->Breturn 0;
}

代码解析:

  • 这个例子展示了多重继承中虚析构函数的工作方式和析构顺序。
  • C类同时继承了A和B,当通过A类型的指针删除C类对象时:
    1. 首先调用派生类C的析构函数
    2. 然后调用直接基类A的析构函数
    3. 最后,由于没有通过B类型的指针,所以B的析构函数不会被调用,这可能导致资源泄露
  • 实际输出是:C destructor然后是A destructor,缺少了B的析构函数调用。
  • 注意: 这里有一个潜在的资源泄露问题,因为B的析构函数没有被调用。在实际开发中,应当避免这种情况,或确保所有基类的资源都能被正确释放。

六、纯虚函数与抽象类

#include<iostream>
using namespace std;class Shape {
public:// 纯虚函数,使Shape成为抽象类virtual double area() = 0;  // 纯虚函数,无实现
};class Circle : public Shape {
private:double radius;  // 圆的半径
public:// 构造函数初始化半径Circle(double r) : radius(r) {}// 实现基类的纯虚函数double area() override {return 3.14 * radius * radius;  // 计算圆的面积:πr²}
};int main() {// 不能直接实例化抽象类,但可以创建其派生类的对象Shape* s = new Circle(5);  // 基类指针指向派生类对象cout << "Area: " << s->area() << endl;  // 输出圆的面积delete s;return 0;
} 

代码解析:

  • 这个例子展示了纯虚函数和抽象类的概念及使用方法。
  • Shape类中包含一个纯虚函数area()(通过= 0表示),使其成为抽象类,不能被直接实例化。
  • Circle类继承自Shape并实现了area()函数,计算圆的面积。
  • 抽象类作为接口,定义了派生类必须实现的功能,是C++实现接口设计模式的常用方式。

总结与拓展

多态的核心要点

  1. 虚函数机制:通过virtual关键字声明的函数,在运行时动态绑定,是实现多态的基础。
  2. 基类指针或引用:通过基类指针或引用调用虚函数,才能体现多态特性。
  3. 函数重写:派生类需要重写(覆盖)基类的虚函数。
  4. 虚析构函数:确保正确释放派生类资源,防止内存泄漏。

几个重要的相关概念

  1. 虚函数表(vtable):C++实现多态的内部机制。每个包含虚函数的类都有一个虚函数表,表中存储着虚函数的地址。
  2. 虚指针(vptr):对象内部的一个隐藏成员,指向该类的虚函数表。
  3. 运行时类型识别(RTTI):C++提供的机制,用于在运行时确定对象的类型,包括dynamic_casttypeid运算符。

实际应用案例

多态在实际开发中应用广泛,例如:

  1. 图形用户界面:不同的控件(按钮、文本框等)都继承自基本控件类,但有自己特定的绘制和交互方式。
  2. 设计模式:许多设计模式(如工厂模式、策略模式、观察者模式等)都依赖多态实现灵活性。
  3. 插件系统:通过定义统一的接口(抽象基类),可以实现可扩展的插件架构。

最佳实践

  1. 始终将析构函数声明为虚函数:如果类设计用于继承,或者包含至少一个虚函数。
  2. 使用override关键字:明确标识重写的函数,有助于避免错误。
  3. 避免在构造和析构期间调用虚函数:这可能导致意外行为。
  4. 合理设计继承层次:过深的继承可能导致代码难以理解和维护。

通过本文的六个精心设计的例子,我们全面探索了C++多态的核心概念和使用方法。掌握这些知识,将帮助你编写更加灵活、可扩展的面向对象程序。


希望这篇文章对你理解C++多态有所帮助!如有任何疑问,欢迎在评论区留言交流。

相关文章:

C++多态与虚函数详解——从入门到精通

C多态与虚函数详解——从入门到精通 引言 在C面向对象编程中&#xff0c;多态是一个核心概念&#xff0c;它赋予了程序极大的灵活性和扩展性。本文将通过六个精心设计的实例&#xff0c;深入浅出地讲解C中的多态、虚函数、继承和抽象类等概念&#xff0c;帮助初学者快速理解这…...

自适应Prompt技术:让LLM精准理解用户意图的进阶策略

开发&#xff5c;界面&#xff5c;引擎&#xff5c;交付&#xff5c;副驾——重写全栈法则&#xff1a;AI原生的倍速造应用流 来自全栈程序员 nine 的探索与实践&#xff0c;持续迭代中。 欢迎关注评论私信交流~ 一、核心挑战&#xff1a;传统Prompt的局限性 传统静态Prompt&…...

Java文件读写程序

1.引言 在日常的软件开发中&#xff0c;文件操作是常见的功能之一。不仅要了解如何读写文件&#xff0c;更要知道如何安全地操作文件以避免程序崩溃或数据丢失。这篇文章将深入分析一个简单的 Java 文件读写程序 Top.java&#xff0c;包括其基本实现、潜在问题以及改进建议&am…...

数字电子技术基础(六十)——使用Digital软件绘制脉冲触发的触发器

目录 1 使用Digital软件来绘制脉冲触发的触发器 1.1 使用Digital软件来绘制脉冲触发的SR触发器 1.2 使用Digitial软件绘制脉冲触发的JK触发器 1.3 使用Digital软件绘制脉冲触发D触发器 1 使用Digital软件来绘制脉冲触发的触发器 1.1 使用Digital软件来绘制脉冲触发的SR触发…...

C++学习:六个月从基础到就业——C++20:范围(Ranges)基础

C学习&#xff1a;六个月从基础到就业——C20&#xff1a;范围(Ranges)基础 本文是我C学习之旅系列的第五十一篇技术文章&#xff0c;也是第三阶段"现代C特性"的第十三篇&#xff0c;介绍C20引入的范围(Ranges)库的基础知识。查看完整系列目录了解更多内容。 引言 S…...

【AGI】模型性能评估框架EvalScope

【AGI】模型性能评估框架EvalScope 项目地址&#xff1a;https://github.com/modelscope/evalscope ​ EvalScope 是由阿里巴巴魔搭社区&#xff08;ModelScope&#xff09;推出的一款开源模型评估框架&#xff0c;旨在为大语言模型&#xff08;LLM&#xff09;和多模态模型提供…...

【老马】离线版金融敏感信息加解密组件开源项目 encryption-local

前言 你是否存在这样的苦恼&#xff0c;数据需要安全存储&#xff0c;但是每个系统大家自己写&#xff0c;很浪费时间。。 每一个子项目各自为政&#xff0c;加解密搞得也无法统一。也许下面这个开源项目可以帮助你。 encryption-local 一个离线版本的金融敏感信息加解密工具…...

利用systemd启动部署在服务器上的web应用

0.背景 系统环境&#xff1a; Ubuntu 22.04 web应用情况&#xff1a; 前后端分类&#xff0c;前端采用react&#xff0c;后端采用fastapi 1.具体配置 1.1 前端配置 开发态运行&#xff08;启动命令是npm run dev&#xff09;,创建systemd服务文件 sudo nano /etc/systemd/…...

YOLOv5目标构建与损失计算

YOLOv5目标构建与损失计算 YOLOv5目标构建与损失计算构建目标关键步骤解析&#xff1a; 计算损失关键实现细节解析各损失分量说明 YOLOv5目标构建与损失计算 YOLOv5作为单阶段目标检测的经典算法&#xff0c;其高效的检测性能离不开精心设计的训练目标构建和损失计算策略。本文…...

【Linux】ELF与动静态库的“暗黑兵法”:程序是如何跑起来的?

目录 一、什么是库&#xff1f; 1. C标准库&#xff08;libc&#xff09; 2. C标准库&#xff08;libstdc&#xff09; 二、静态库 1. 静态库的生成 2. 静态库的使用 三、动态库 1. 动态库的生成 2. 动态库的使用 3. 库运行的搜索路径。 &#xff08;1&#xff09;原因…...

【图书管理系统】用户注册系统实现详解

引言 本系统允许用户输入用户名和密码&#xff0c;前端通过AJAX请求将数据发送到后端&#xff0c;后端验证并存储用户信息&#xff0c;同时为每个用户创建一个专属图书表。尽管这是一个基础实现&#xff0c;但它展示了前后端分离开发的核心思想。博客还将讨论潜在的优化点&…...

FastDFS分布式文件系统架构学习(一)

FastDFS分布式文件系统架构学习 1. FastDFS简介 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;由淘宝资深架构师余庆设计并开发。它专为互联网应用量身定制&#xff0c;特别适合以中小文件&#xff08;如图片、文档、音视频等&#xff09;为载体的在线服务。FastDFS不…...

Oracle 内存优化

Oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区&#xff0c;也就是 SGA和 PGA(process global area or private global area)。对于 SGA 区域内的内存来说&#xff0c;是共享的全局的。在 UNIX 上&#xff0c;必须为 Oracle 设置共享内存段(可以是一个或者多…...

算法题(149):矩阵消除游戏

审题&#xff1a; 本题需要我们找到消除矩阵行与列后可以获得的最大权值 思路&#xff1a; 方法一&#xff1a;贪心二进制枚举 这里的矩阵消除时&#xff0c;行与列的消除会互相影响&#xff0c;所以如果我们先统计所有行和列的总和&#xff0c;然后选择消除最大的那一行/列&am…...

AI:NLP 情感分析

💬 从零开始掌握情感分析:NLP 初学者实战指南 本文适合自然语言处理(NLP)入门者,聚焦于最热门应用之一——情感分析(Sentiment Analysis)。无论你是学生、工程师,还是数据爱好者,都可以通过本文了解情感分析的原理、方法和实现技巧。 🧠 一、什么是情感分析? 情感…...

LearnOpenGL---着色器

着色器的例子 文章目录 着色器的例子1.颜色变化的三角形2.构造三个顶点颜色不同的一个三角形 1.颜色变化的三角形 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <cmath>void framebuffer_size_callback(GLFWwindow* …...

计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 13.几何着色器(一)修改顶点

几何着色器 以下是OpenGL图像管线的主要阶段&#xff1a; 几何着色器&#xff08;Geometry Shader&#xff09; 几何着色器是OpenGL管线中的一个可选阶段&#xff0c;位于顶点着色器和片段着色器之间。它能够动态地生成或修改图元&#xff08;primitives&#xff09;。 主…...

如何利用 Java 爬虫获得某书笔记详情:实战指南

在知识分享和学习的领域&#xff0c;许多平台提供了丰富的书籍笔记和学习资源。通过 Java 爬虫技术&#xff0c;我们可以高效地获取这些笔记的详细信息&#xff0c;以便进行进一步的分析和整理。本文将详细介绍如何利用 Java 爬虫获取某书笔记详情&#xff0c;并提供完整的代码…...

【关联git本地仓库,上传项目到github】

目录 1.下载git2.绑定用户3.git本地与远程仓库交互4.github项目创建5.上传本地项目到github6.完结撒花❀❀❀&#xff01;&#xff01;&#xff01; 1.下载git git下载地址&#xff1a;https://git-scm.com/downloads 下载安装后创建快捷地址&#xff1a;&#xff08;此处比较…...

计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统

NMR&#xff08;N-Modular Redundancy&#xff0c;N 模冗余&#xff09;是一种通用的容错设计架构&#xff0c;通过引入 N 个冗余模块&#xff08;N ≥ 3 且为奇数&#xff09;&#xff0c;并采用多数投票机制&#xff0c;来提升系统的容错能力与可靠性。单个模块如果可靠性小于…...

配置代理服务器访问github、google

配置代理服务器访问github、google 背景与原理配置环境配置步骤云主机配置Windows客户端创建SSH隧道安装 Windows 内置 OpenSSHssh config 配置文件创建动态代理隧道 浏览器代理设置 验证浏览器访问google、githubssh 访问github 背景与原理 由于网络政策限制&#xff0c;中国…...

Java API学习笔记

一.类 1. String 类 不可变性&#xff1a;String对象创建后不可修改&#xff0c;每次操作返回新对象 String str "Hello"; str.length(); str.charAt(0); str.substring(1, 4); str.indexOf("l"); str.equals("hel…...

C++ map容器: 插入操作

1. map插入操作基础 map是C STL中的关联容器&#xff0c;存储键值对(key-value pairs)。插入元素时有四种主要方式&#xff0c;各有特点&#xff1a; 1.1 头文件与声明 #include <map> using namespace std;map<int, string> mapStu; // 键为int&#xff0c;值…...

Linux SSH 远程连接全攻略:从加密原理到实战配置(含图解)

一、SSH 加密体系核心理论 &#xff08;一&#xff09;对称加密与非对称加密对比解析 1. 加密算法分类与应用场景 类型代表算法密钥数量加密速度安全性特点典型用途对称加密AES、3DES1 个★★★★☆密钥传输风险高会话数据加密非对称加密RSA、ECC2 个★★☆☆☆公钥可公开&a…...

项目制作流程

一、使用 CRA 创建项目 npx create-react-app name 二、按照业务规范整理项目目录 &#xff08;重点src目录&#xff09; 三、安装插件 npm install sass -Dnpm install antd --savenpm install react-router-dom 四、配置基础路由 Router 1. 安装路由包 react-router-dom …...

ctr查看镜像

# 拉取镜像到 k8s.io 命名空间 sudo nerdctl --namespace k8s.io pull nginx:1.23.4 # 验证镜像是否已下载 sudo nerdctl --namespace k8s.io images 下载镜像到k8s.io名称空间下 nerdctl --namespace k8s.io pull zookeeper:3.6.2 sudo ctr image pull --namespace k8s.io …...

【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析

【深度学习基础】从感知机到多层神经网络&#xff1a;模型原理、结构与计算过程全解析 1. 引言 神经网络的重要性&#xff1a; 作为人工智能的核心技术之一&#xff0c;神经网络通过模拟人脑神经元的工作机制&#xff0c;成为解决复杂模式识别、预测和决策任务的利器。从图像分…...

discuz X3.5批量新建用户

<?php define(IN_DISCUZ, true); require ./source/class/class_core.php; // 确保管理员权限&#xff08;可选&#xff0c;增加安全性&#xff09;删除这一段加粗则可以直接使用. if ($_G[adminid] ! 1) { exit(Access denied. Only admin allowed.); } C::app()->…...

symfonos: 1靶场

symfonos: 1 来自 <https://www.vulnhub.com/entry/symfonos-1,322/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.252 3&…...

C# String 格式说明符

标准格式说明符数字格式说明符C 或 c&#xff1a;货币格式D 或 d&#xff1a;十进制数字格式E 或 e&#xff1a;科学计数法格式。F 或 f&#xff1a;固定点格式G 或 g&#xff1a;常规格式N 或 n&#xff1a;数字格式P 或 p&#xff1a;百分比格式X 或 x&#xff1a;十六进制格…...

Python高级特性深度解析:从熟练到精通的跃迁之路

Python高级特性深度解析&#xff1a;从熟练到精通的跃迁之路 引言 对于已经掌握Python基础语法的开发者而言&#xff0c;如何突破瓶颈进入高手行列&#xff1f;本文将从Python的高级特性入手&#xff0c;深入剖析那些能让代码更优雅、效率更高的技术点&#xff0c;助你完成从…...

【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等

前言 又到熟悉的前言&#xff0c;接到个需求&#xff0c;要引入高德地图api&#xff0c;我就记录一下&#xff0c;要是有帮助记得点赞、收藏、关注&#x1f601;。 后续有时间会慢慢完善一些文章&#xff1a;&#xff08;画饼时间&#xff09; map组件自定义气泡、mark标记点…...

贪心、分治和回溯算法

1. 贪心算法 1.1. 贪心算法的概念 定义&#xff1a;在求解过程中&#xff0c;始终做出当前状态下看起来“最优”的选择&#xff0c;不回退。核心思想&#xff1a;每一步都选择当前最优解&#xff0c;期望最后得到全局最优解。 适用问题的特征&#xff1a; 问题可以分解成多个…...

window自带截图快捷键

Win Shift S&#xff1a;按此组合键后&#xff0c;会出现截图模式选择框&#xff0c;可选择矩形截图、任意形状截图、窗口截图和全屏幕截图&#xff0c;然后使用 “Ctrl V” 粘贴截图内容...

简单使用Slidev和PPTist

简单使用Slidev和PPTist 1 简介 前端PPT制作有很多优秀的工具包&#xff0c;例如&#xff1a;Slidev、revealjs、PPTist等&#xff0c;Slidev对Markdown格式支持较好&#xff0c;适合与大模型结合使用&#xff0c;选哟二次封装&#xff1b;revealjs适合做数据切换&#xff0c…...

1.2.2

某智慧养老平台的心率监测模块目前存在数据准确性不高、异常预警响应慢等问题&#xff0c;影响了老年人健康监测的体验和服务质量。作为人工智能训练师&#xff0c;你需要结合业务知识和人工智能技术&#xff0c;对该模块进行优化设计与实现。 &#xff08;1&#xff09;列出心…...

LeeCode 101.对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 提示&#xff1a; 树中节点数目在范围 [1, 1000] 内-100 < Node.val < 100 进阶&#xff1a;你可以运用递归和迭代两种方法解决这个问题吗&#xff1f; 答案 && 测试代码&#xff1a; #include &…...

面向GIS的Android studio移动开发(二)--在地图上绘制电子围栏

电子围栏&#xff0c;校园跑的常客&#xff0c;也是定位打卡必不可少的东西 主要代码&#xff1a; 创建电子围栏代码 // 添加多边形地理围栏&#xff08;兼容2023版SDK&#xff09;private void addPolygon(String fenceName, List<LatLng> points) {if (points null…...

《从零开始:Spring Cloud Eureka 配置与服务注册全流程》​

关于Eureka的学习&#xff0c;主要学习如何搭建Eureka&#xff0c;将order-service和product-service都注册到Eureka。 1.为什么使用Eureka? 我在实现一个查询订单功能时&#xff0c;希望可以根据订单中productId去获取对应商品的详细信息&#xff0c;但是产品服务和订单服…...

能力验证及大练兵活动第一期

计算机 请根据计算机检材&#xff0c;回答以下问题&#xff1a; (10道题&#xff0c;共19.0分) 1. 计算机中曾挂载的Bitlocker加密分区的恢复密钥后6位为&#xff1f;&#xff08;答案格式&#xff1a;6位数字&#xff09; (1.0分) 答案&#xff1a;700755 2. 请写出曾远程连…...

TASK03【Datawhale 组队学习】搭建向量知识库

文章目录 向量及向量知识库词向量与向量向量数据库 数据处理数据清洗文档分割 搭建并使用向量数据库 向量及向量知识库 词向量与向量 词向量&#xff08;word embedding&#xff09;是一种以单词为单位将每个单词转化为实数向量的技术。词向量背后的主要想理念是相似或相关的…...

ProfibusDP转ModbusRTU的实用攻略

ProfibusDP转ModbusRTU的实用攻略 在工业自动化领域中&#xff0c;Profibus DP和Modbus RTU是两种常见的通信协议。 Profibus DP是一种广泛应用于过程控制和工厂自动化的现场总线标准&#xff0c;具有高实时性和可靠性。 而Modbus RTU则是一种串行通信协议&#xff0c;常用于…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的去中心化商业扩散研究

摘要&#xff1a;本文探讨在去中心化商业趋势下&#xff0c;开源AI智能名片链动21模式S2B2C商城小程序源码如何助力企业挖掘数据价值、打破信息孤岛&#xff0c;实现商业高效扩散。通过分析该技术组合的架构与功能&#xff0c;结合实际案例&#xff0c;揭示其在用户关系拓展、流…...

iOS 工厂模式

iOS 工厂模式 文章目录 iOS 工厂模式前言工厂模式简单工厂案例场景分析苹果类优点缺点 小结 工厂模式客户端调用**优点****缺点** 抽象工厂模式三个模式对比 前言 笔者之前学习了有关于设计模式的六大原则,之前简单了解过这个工厂模式,今天主要是重新学习一下这个模式,正式系统…...

LaTeX OCR - 数学公式识别系统

文章目录 一、关于 LaTeX OCR1、项目概览架构图2、相关链接资源3、功能特性 二、安装配置基础环境要求Linux 安装Mac 安装 三、使用指南1、快速训练&#xff08;小数据集&#xff09;2、完整训练&#xff08;大数据集&#xff09; 四、可视化功能训练过程可视化预测过程可视化 …...

Go 语言即时通讯系统开发日志-日志day2-5:架构设计与日志封装

Go语言即时通讯系统开发日志day2 计划&#xff1a;学习go中MySQL&#xff0c;Redis的使用&#xff0c;使用MySQL和Redis完成一个单聊demo。 总结&#xff1a;现在每天下午用来开发这个项目&#xff0c;如果有课的话可能学习时间只有3-4个小时&#xff0c;再加上今天的学习效率不…...

@JsonProperty和@JSONField 使用

JsonProperty和JSONField注解的区别 1.底层框架不同 JsonProperty 是Jackson实现的 JSONField 是fastjson实现的 2.用法不同 &#xff08;1&#xff09;bean序列化为Json&#xff1a; JsonProperty&#xff1a; ObjectMapper().writeValueAsString(Object value) JSONField&…...

从代码学习深度学习 - 近似训练 PyTorch版

文章目录 前言负采样 (Negative Sampling)层序Softmax (Hierarchical Softmax)代码示例总结前言 在自然语言处理(NLP)领域,词嵌入(Word Embeddings)技术如Word2Vec(包括Skip-gram和CBOW模型)已经成为一项基础且强大的工具。它们能够将词语映射到低维稠密向量空间,使得…...

代码上传gitte仓库

把代码push上去就行...

系统架构设计(十四):解释器风格

概念 解释器风格是一种将程序的每个语句逐条读取并解释执行的体系结构风格。程序在运行时不会先被编译为机器码&#xff0c;而是动态地由解释器分析并执行其语义。 典型应用&#xff1a;Python 解释器、JavaScript 引擎、Bash Shell、SQL 引擎。 组成结构 解释器风格系统的…...