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

C++继承完全指南:从语法到设计模式----图解原理+工业级代码示例+陷阱规避

🔮✨⚡️🌌 欢迎来到张有志的量子编程次元 🌌⚡️✨🔮

▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂
🛸 核心探索舱 🛸
⇩⇩⇩ 正在加载未来代码 ⇩⇩⇩
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

🌀 [ 思维矩阵 ]⚡C++量子演算场⚡ 🌀

▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮
💾 交互协议 💾
✅ 知识下载前请先【点赞】激活能量塔
✅ 源代码传输需【收藏】建立稳定连接
✅ 欢迎在【评论】区留下时空印记
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮

🚨⚠️ 警告:即将进入代码奇点 ⚠️🚨
🎯 编译未来 | 调试宇宙 | 运行奇迹 🎯

[ 视觉识别系统激活 ]
量子隧穿效应示意图

文章目录

    • 一、为什么C++开发者对继承又爱又恨?
      • 一、从两个经典案例说起
      • 二、继承的本质矛盾
      • 三、何时该使用继承?
      • 四、现代C++的继承进化
    • 二、核心知识模块(配Mermaid图表)
  • 第二章 解剖C++继承:从对象模型到性能陷阱
    • 2.1 对象内存布局真相
      • 2.1.1 单继承内存模型
      • 2.1.2 多重继承内存布局
    • 2.2 虚函数机制深度解析
      • 2.2.1 虚表构建过程
      • 2.2.2 动态绑定的代价
    • 2.3 继承中的隐藏陷阱
      • 2.3.1 对象切片(Object Slicing)
      • 2.3.2 构造函数顺序问题
    • 2.4 现代C++改进方案
      • 2.4.1 final关键字优化
      • 2.4.2 空基类优化(EBCO)
    • 三、超越继承:现代C++设计模式实战
    • 3.1 组合优于继承的实证分析
      • 3.1.1 电商系统重构案例
    • 3.2 现代C++替代方案详解
      • 3.2.1 策略模式模板化实现
      • 3.2.2 类型擦除技术(C++17)
    • 3.3 编译时多态进阶技巧
      • 3.3.1 CRTP模式深度优化
      • 3.3.2 概念约束(C++20)
    • 3.4 混合设计方案实战
      • 3.4.1 游戏引擎实体组件系统(ECS)
    • 3.5 决策树:何时选择何种方案
    • 四、多重继承的黑暗艺术:从编译器视角到实战应用
    • 4.1 多重继承的内存迷宫
      • 4.1.1 典型内存布局(GCC/Clang/MSVC对比)
      • 4.1.2 指针调整的底层原理
    • 4.2 菱形继承的工业级解决方案
      • 4.2.1 LLVM中的经典案例
      • 4.2.2 虚继承性能实测
    • 4.3 多重继承的黄金法则
      • 4.3.1 接口隔离模式
      • 4.3.2 致命陷阱规避指南
    • 4.4 编译器魔法揭秘
      • 4.4.1 虚表结构深度解析
      • 4.4.2 动态类型转换的实现
    • 4.5 实战:实现一个安全的多重继承框架
      • 4.5.1 类型安全的包装器
      • 4.5.2 跨平台内存布局验证
    • 五、未来之战:C++26新特性与元编程重构
    • 5.1 C++26 Delegating Inheritance(委派继承)
      • 5.1.1 现行问题的革命性解决方案
      • 5.1.2 编译器预期实现原理
    • 5.2 元编程重构继承体系
      • 5.2.1 静态反射实现接口检查
      • 5.2.2 编译时继承关系验证
    • 5.3 模式匹配与继承的融合
      • 5.3.1 类型模式匹配(P2392提案)
      • 5.3.2 动态派发优化
    • 5.4 实战:用元编程重构传统继承
      • 5.4.1 自动生成CRTP基类
      • 5.4.2 零成本接口检查
    • 拓展阅读
      • 1. **C++23新特性:`[[no_unique_address]]`与继承**
      • 2. **跨语言对比:Java/Kotlin继承设计**
      • 3. **设计模式:模板方法模式中的继承**
      • 其他推荐工具:

一、为什么C++开发者对继承又爱又恨?

35% 45% 20% C++继承使用场景统计 合理使用 过度使用 完全避免

一、从两个经典案例说起

案例1:Qt框架的成功密码

// Qt的QObject继承体系
class QWidget : public QObject, public QPaintDevice {// 超过200个派生类共享事件处理机制
};
  • 通过继承实现:信号槽机制、对象树内存管理
  • 优势体现:减少60%重复代码(Qt官方数据)

案例2:某电商系统的架构教训

OrderService
+createOrder()
DiscountOrderService
+applyDiscount()
GroupBuyOrderService
+handleGroup()
  • 灾难后果
    • 新增促销类型需修改5个中间层类
    • 简单的价格计算调用链深度达15层
    • 最终重构成本:3人月

二、继承的本质矛盾

理想情况现实挑战
代码复用耦合度飙升
多态扩展性能损失
层次清晰菱形灾难

编译器开发者的视角

“每个虚函数调用相当于多一次指针解引用,现代CPU分支预测会失效”
—— LLVM核心开发者Chris Lattner

三、何时该使用继承?

稳定
易变
需求分析
是否符合is-a关系?
考虑公有继承
是否需要多态?
评估组合+接口
直接使用组合
检查基类是否稳定
允许继承
考虑策略模式

Google C++ Style Guide的建议

"只有当所有以下条件满足时才使用继承:

  1. 派生类确实是基类的子类型
  2. 基类的代码不会被频繁修改
  3. 继承不会导致菱形层次结构"

四、现代C++的继承进化

  • C++11override/final关键字
  • C++17:结构化绑定对继承的影响
  • C++20[[no_unique_address]]优化空基类

一个令人惊讶的事实

MSVC在调试模式下,每层继承会增加8字节内存开销(RTTI信息)



二、核心知识模块(配Mermaid图表)

第二章 解剖C++继承:从对象模型到性能陷阱

通过vptr关联
内存布局
+基类子对象
+派生类新增数据
+内存对齐空隙
+虚表指针(vptr)
虚函数表
+type_info
+虚函数指针数组
+偏移量信息
访问控制
+public继承权限
+protected继承权限
+private继承权限

2.1 对象内存布局真相

2.1.1 单继承内存模型

典型GCC布局示例

class Base {int x;virtual void foo();
};
class Derived : public Base {int y;void foo() override;
};
Derived对象
Base::x
vptr
Derived::y
虚表
&Derived::foo()

关键发现

  • 派生类对象头部始终包含基类子对象
  • 虚函数指针在多数实现中位于首地址(MSVC/GCC验证)
  • 内存对齐可能导致中间空隙(sizeof(Derived)可能大于预期)

2.1.2 多重继承内存布局

实测案例

class Base1 { virtual void f1(); int a; };
class Base2 { virtual void f2(); int b; };
class Derived : public Base1, public Base2 { int c; };
Derived
Base1::a
vptr1
vptr2
Base2::b
Derived::c
虚表1
&Derived::f1()
虚表2
thunk to Derived::f2()

2.2 虚函数机制深度解析

2.2.1 虚表构建过程

编译器幕后工作

  1. 为每个含虚函数的类生成虚表
  2. 构造函数中隐式设置vptr
  3. 多继承时生成多个虚表指针

GDB实战观察

(gdb) p *(void**)obj  # 查看虚表指针
(gdb) p /a *(void**)obj@4  # 查看前4个虚表条目

2.2.2 动态绑定的代价

性能测试数据(i9-13900K)

调用方式吞吐量(百万次/秒)
直接调用850
虚函数调用620
虚函数+多继承410

关键结论

  • 虚函数调用导致约27%性能下降
  • 多继承场景分支预测失败率增加40%

2.3 继承中的隐藏陷阱

2.3.1 对象切片(Object Slicing)

class Base { int x; };
class Derived : public Base { int y; };void func(Base b) {...}Derived d;
func(d);  // 发生切片,丢失Derived部分数据
拷贝构造
完整的Derived对象
只有Base部分的临时对象

2.3.2 构造函数顺序问题

危险案例

class Base {
public:Base() { init(); }  // 调用虚函数!virtual void init() = 0;
};class Derived : public Base {int resource;
public:void init() override { resource = malloc(1024); }
};
// 此时Derived尚未构造,resource未初始化

安全模式

class SafeBase {
protected:void postConstruct() { /* 真正初始化代码 */ }
public:template<typename T>static T* create() {T* obj = new T();obj->postConstruct();return obj;}
};

2.4 现代C++改进方案

2.4.1 final关键字优化

class Widget final : public Base {// 禁止进一步派生// 编译器可优化虚表
};

2.4.2 空基类优化(EBCO)

class Empty {};
class Derived : private Empty { int x;
};
static_assert(sizeof(Derived) == sizeof(int));

C++20增强

class [[no_unique_address]] Empty {};

三、超越继承:现代C++设计模式实战

45% 30% 15% 10% 大型项目中继承的替代方案分布 组合+接口 策略模式 类型擦除 CRTP

3.1 组合优于继承的实证分析

3.1.1 电商系统重构案例

原始继承结构

OrderProcessor
+process()
DiscountOrderProcessor
+applyDiscount()
FlashSaleOrderProcessor
+validateStock()

改造后组合结构

class DiscountStrategy {
public:virtual void apply() = 0;
};class OrderProcessor {std::unique_ptr<DiscountStrategy> discount_;
public:void setDiscount(std::unique_ptr<DiscountStrategy>&& ds) {discount_ = std::move(ds);}void process() {if(discount_) discount_->apply();// 核心处理逻辑}
};

性能对比

指标继承方案组合方案
内存占用1.8MB1.2MB
新增促销类型修改5处新增1类
单元测试时间120ms45ms

3.2 现代C++替代方案详解

3.2.1 策略模式模板化实现

template<typename DiscountStrategy>
class OrderProcessor {DiscountStrategy strategy_;
public:void process() {strategy_.apply();// 编译时多态}
};// 使用示例
OrderProcessor<SeasonalDiscount> processor;

3.2.2 类型擦除技术(C++17)

class AnyDrawable {struct Concept {virtual ~Concept() = default;virtual void draw() const = 0;};template<typename T>struct Model : Concept {T obj;void draw() const override { obj.draw(); }};std::unique_ptr<Concept> ptr_;
public:template<typename T>AnyDrawable(T&& obj) : ptr_(new Model<std::decay_t<T>>{std::forward<T>(obj)}) {}void draw() const { ptr_->draw(); }
};// 使用示例
AnyDrawable d1 = Circle();  // 无需共同基类
AnyDrawable d2 = Square();
d1.draw(); d2.draw();

3.3 编译时多态进阶技巧

3.3.1 CRTP模式深度优化

template<typename Derived>
class Shape {
public:void draw() {static_cast<Derived*>(this)->drawImpl();}// 编译期接口检查static_assert(std::is_invocable_v<decltype(&Derived::drawImpl), Derived>,"必须实现drawImpl方法");
};class Circle : public Shape<Circle> {
public:void drawImpl() { /*...*/ }
};

3.3.2 概念约束(C++20)

template<typename T>
concept Drawable = requires(T t) {{ t.draw() } -> std::same_as<void>;
};class Canvas {
public:template<Drawable... Ts>void render(Ts&&... items) {(..., items.draw());}
};

3.4 混合设计方案实战

3.4.1 游戏引擎实体组件系统(ECS)

Entity
TransformComponent
RenderComponent
PhysicsComponent
使用组合而非继承
独立数据与行为

内存布局优化

// 传统继承
class GameObject {virtual ~GameObject() = default;virtual void update() = 0;// 公共数据...
};// ECS方案
struct Position { float x,y; };
struct Velocity { float vx,vy; };entt::registry registry;
auto entity = registry.create();
registry.emplace<Position>(entity, 0.f, 0.f);
registry.emplace<Velocity>(entity, 1.f, -1.f);

3.5 决策树:何时选择何种方案

需求分析
需要运行时多态?
类型数量是否固定?
策略模式+模板
类型擦除
需要编译时接口检查?
CRTP+概念
简单组合

各方案性能特征

方案内存开销调用开销扩展性
传统虚函数
类型擦除极强
CRTP
策略模板

四、多重继承的黑暗艺术:从编译器视角到实战应用

38% 29% 18% 15% 开源框架中多重继承使用率 LLVM/Clang Qt Framework Boost库 STL实现

4.1 多重继承的内存迷宫

4.1.1 典型内存布局(GCC/Clang/MSVC对比)

class Base1 { int x; virtual void f1(); };
class Base2 { int y; virtual void f2(); };
class Derived : public Base1, public Base2 { int z; };

各编译器差异

编译器内存布局特征sizeof(Derived)
GCC基类顺序排列24 bytes
MSVC插入对齐空隙32 bytes
Clang优化空基类20 bytes
GCC布局
Base1::x
vptr1
vptr2
Base2::y
Derived::z

4.1.2 指针调整的底层原理

lea rax, [rdi+16]  ; 调整this指针
call Base2::f2

调试技巧

# 查看this指针调整
g++ -fdump-class-hierarchy -fdump-rtl-all

4.2 菱形继承的工业级解决方案

4.2.1 LLVM中的经典案例

class Value {
protected:virtual ~Value() = default;
};
class User : virtual public Value {  // 虚继承void* Operands;
};
class Instruction : virtual public Value {BasicBlock* Parent;
};
class CallInst : public User, public Instruction {// 最终只含一个Value子对象
};
virtual
virtual
Value
User
Instruction
CallInst

关键优化

  • 虚基类偏移量表(VTT)减少75%冗余数据
  • 通过-fno-strong-vtables关闭冗余虚表

4.2.2 虚继承性能实测

操作普通继承(ms)虚继承(ms)
构造对象1538
虚函数调用822
动态类型转换1245

4.3 多重继承的黄金法则

4.3.1 接口隔离模式

class Drawable {
public:virtual void draw() = 0;
};
class Loggable {
public:virtual std::string log() const = 0;
};
class Widget : public Drawable, public Loggable {// 实现多个正交接口
};

4.3.2 致命陷阱规避指南

  1. 构造函数顺序问题
class Base1 { public: Base1(int); };
class Base2 { public: Base2(int); };
class Derived : public Base1, public Base2 {
public:Derived() : Base2(1), Base1(2) {} // 实际初始化顺序仍为Base1→Base2
};
  1. 重载函数遮蔽
class Base1 { public: void func(int); };
class Base2 { public: void func(double); };
class Derived : public Base1, public Base2 {
public:using Base1::func;  // 必须显式引入using Base2::func;
};

4.4 编译器魔法揭秘

4.4.1 虚表结构深度解析

Derived虚表
&Derived::f1
Base1虚表部分
Base2虚表部分
thunk to Derived::f2
虚基类偏移量
16

4.4.2 动态类型转换的实现

Base2* pb = dynamic_cast<Base2*>(pd);
// 编译后实际等价于:
Base2* pb = pd ? (Base2*)((char*)pd + offset) : nullptr;

RTTI成本分析

  • 每个含虚函数的类增加约24字节类型信息
  • dynamic_caststatic_cast慢3-5倍

4.5 实战:实现一个安全的多重继承框架

4.5.1 类型安全的包装器

template<typename... Bases>
class SafeMultiDerived : public Bases... {
public:static_assert((std::has_virtual_destructor_v<Bases> && ...),"所有基类必须有虚析构函数");template<typename Base>Base* as() noexcept {if constexpr (std::is_base_of_v<Base, SafeMultiDerived>) {return static_cast<Base*>(this);}return nullptr;}
};

4.5.2 跨平台内存布局验证

static_assert(offsetof(Derived, Base1::x) == 8,"内存布局不符合预期");

五、未来之战:C++26新特性与元编程重构

45% 30% 15% 10% C++26继承相关提案关注度 Delegating Inheritance Metaclasses Dynamic Reflection Interface Contracts

5.1 C++26 Delegating Inheritance(委派继承)

5.1.1 现行问题的革命性解决方案

传统实现继承的痛点

class Database {
public:virtual void connect() = 0;
};
class Logger {
public:virtual void log() = 0;
};// 传统多重继承导致方法冲突
class Service : public Database, public Logger {void connect() override;void log() override;// 必须实现所有接口
};

委派继承提案

class [[delegating]] Service {Database db;  // 自动生成转发方法Logger log;   // 按需委托实现
};// 使用示例
Service s;
s.db.connect();  // 显式委派调用
s.log.log();     // 命名空间式访问

5.1.2 编译器预期实现原理

源代码
语法分析
生成委托存根
注入成员函数
代码生成

5.2 元编程重构继承体系

5.2.1 静态反射实现接口检查

template<typename T>
concept Drawable = requires {requires std::meta::has_member<T>("draw");requires std::meta::is_invocable<std::meta::get_member<T>("draw")>;
};class Canvas {template<Drawable... Ts>void render(Ts&&... objs) {(..., objs.draw());}
};

5.2.2 编译时继承关系验证

template<typename Derived, typename Base>
constexpr bool is_strict_base_of = std::meta::is_base_of<Base, Derived> &&!std::same_as<Base, Derived>;static_assert(is_strict_base_of<Derived, Base>,"违反继承约束");

5.3 模式匹配与继承的融合

5.3.1 类型模式匹配(P2392提案)

void process(auto obj) {inspect(obj) {<Shape> s => s.draw();    // 类型匹配<Widget&> w => w.show();  // 引用匹配_ => default_action();    // 默认处理}
}

5.3.2 动态派发优化

命中缓存
未命中
虚函数调用
模式匹配
直接调用
查表跳转

性能对比

方式调用周期(CPU cycles)
传统虚函数18
模式匹配9(命中缓存)

5.4 实战:用元编程重构传统继承

5.4.1 自动生成CRTP基类

template<typename T>
[[generate]] class Cloneable {T* clone() const {return new T(*static_cast<const T*>(this));}
};// 使用示例
class Widget : Cloneable<Widget> {// 自动获得clone实现
};

5.4.2 零成本接口检查

template<typename T>
void serialize(T obj) {constexpr auto methods = std::meta::members_of<T>();static_assert(std::meta::contains(methods, "to_json"),"类型必须实现to_json方法");obj.to_json();
}

拓展阅读

1. C++23新特性:[[no_unique_address]]与继承

  • 官方参考
    C++23 Working Draft(标准草案原文)

  • 实战教程
    Arthur O’Dwyer’s Blog - Empty Base Optimization
    代码示例

    struct Empty {};
    struct Foo {[[no_unique_address]] Empty e;  // 可能不占空间int x;
    };
    static_assert(sizeof(Foo) == sizeof(int));  // 在多数平台成立
    
  • 继承场景
    StackOverflow讨论(搜索"no_unique_address inheritance")


2. 跨语言对比:Java/Kotlin继承设计

  • 官方文档对比
    • Java继承
    • Kotlin继承(关键字openfinal默认)
  • 关键差异总结
    // Kotlin示例
    open class Base(val x: Int)  // 必须显式声明open
    class Derived(x: Int) : Base(x)// Java等效
    class Base { public Base(int x) {} }
    class Derived extends Base { public Derived(int x) { super(x); } }
    
  • 深入分析
    Kotlin vs Java设计哲学(搜索"inheritance design")

3. 设计模式:模板方法模式中的继承

  • 模式定义
    Refactoring.Guru模板方法模式(含UML图和多语言示例)
  • 经典实现
    abstract class Game {// 模板方法(final防止子类覆盖流程)final void play() {initialize();startPlay();endPlay();}abstract void initialize();abstract void startPlay();
    }
    
  • 现代替代方案
    Composition over Inheritance(讨论函数式接口替代方案)

其他推荐工具:

  • C++编译器支持查询
    C++23 Support Tables
  • 在线代码对比
    Diffchecker(比较Java/Kotlin实现差异)

相关文章:

C++继承完全指南:从语法到设计模式----图解原理+工业级代码示例+陷阱规避

&#x1f52e;✨⚡️&#x1f30c; 欢迎来到张有志的量子编程次元 &#x1f30c;⚡️✨&#x1f52e; ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ &#x1f6f8; 核心探索舱 &#x1f6f8; ⇩⇩⇩ 正在加载未来代码 ⇩⇩⇩ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔…...

使用Pholcus编写Go爬虫示例

想用Pholcus库来写一个Go的爬虫程序。首先&#xff0c;我得确认Pholcus的当前状态&#xff0c;因为之前听说过它可能已经不再维护了。不过用户可能还是需要基于这个库的示例&#xff0c;所以得先提供一个基本的框架。 首先&#xff0c;我应该回忆一下Pholcus的基本用法。Pholc…...

R Excel 文件:高效数据处理与可视化工具的完美结合

R Excel 文件&#xff1a;高效数据处理与可视化工具的完美结合 引言 在数据分析和处理领域&#xff0c;R语言因其强大的数据处理能力和丰富的可视化功能而备受青睐。而Excel作为最常用的电子表格软件&#xff0c;其广泛的应用也使得R与Excel的结合成为数据处理与可视化的理想…...

Python设计模式:适配模式

1. 适配模式&#xff08;Adapter Pattern&#xff09;详解 适配模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一种接口。适配模式使得原本由于接口不兼容而无法一起工作的类可以协同工作。换句话说…...

Python设计模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。换句话说&#xff0c;策略模式允许在运…...

Unity Internal-ScreenSpaceShadows 分析

一、代码结构 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "Hidden/Internal-ScreenSpaceShadows" {Properties {_ShadowMapTexture ("", any) "" {} // 阴影贴图纹理&…...

nginx配置oss代理

工作中会有一些时候需要将图片,视频,音频等文件放到oss这种对象存储中进行存储,实现高性能的访问,这种情况叫做动静分离.这里只做了图片的配置,视频以及音频的配置是一样的. 以下是nginx.conf的配置信息,其中还有ssl的加密配置,以及后端服务器的代理模块配置,(这里不用的话可以…...

UML对象图

UML对象图 一、对象图核心概念 对象图&#xff08;Object Diagram&#xff09;描述的是系统在某一时刻对象&#xff08;实例&#xff09;的状态快照。它关注的是实际对象之间的实例关系&#xff0c;而不是类与类之间的静态结构。主要特点有&#xff1a; ​对象&#xff08;Ob…...

手机不同App音量自动调节软件

软件介绍 在日常使用手机的过程中&#xff0c;大家是不是经常会遇到在不同App之间切换时&#xff0c;需要频繁调整音量的情况呢&#xff1f;这样真的很不方便。而一款名为App Volume Control的软件就能很好地解决这个问题。 App Volume Control借助辅助功能服务&#xff0c;能…...

模板方法模式详解

模板方法模式详解及真实场景解决方案 推荐学习完策略模式和模板方法模式看这个案例&#xff1a; 策略与模板方法模式组合详解 模式定义 模板方法模式是一种行为设计模式&#xff0c;在父类中定义算法的骨架&#xff0c;允许子类在不改变算法结构的情况下重写特定步骤。核心思…...

基于SSM邮件收发管理系统(带源码、论文)

摘要 随着互联网技术的迅速发展和普及&#xff0c;网络通信已经成了人们离不开的通信手段。作为最早出现的网络通信方式还有世界上应用最为广泛的网络服务之一&#xff0c;电子邮件综合了电话通信和传统邮件的特点&#xff0c;具有传播速度快、价格低廉的优良特性。随着技术发…...

1990-2019年各地级市GDP数据

1990-2019年各地级市GDP数据 1、时间&#xff1a;1990-2019年 2、来源&#xff1a;城市年鉴 3、指标&#xff1a;行政区划代码、年份、省份、城市、经度、纬度、地区生产总值(万元) 4、范围&#xff1a;250地级市 5、指标解释&#xff1a;地区生产总值&#xff08;Gross R…...

Scala相关知识学习总结5

1、多维数组 定义&#xff1a; val arr Array.ofDim[Double](3,4) 表示二维数组中有三个一维数组&#xff0c;每个一维数组有四个元素。 2、列表 List 不可变 List&#xff1a;默认不可变&#xff0c;可创建有序且可重复的列表&#xff0c;可使用:从右向左增加数据&#xf…...

【LangChain Agent 】详解,构建自主决策的 LLM 应用

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是 Lang Chain 2、什么是 Agent 二、LangChain …...

Scala基础知识7

一&#xff0c;可变数组和不可变数组的转换方法: 不可变数组转换为可变数组使用 toBuffer 函数. 可变数组转换为不可变数组使用 toArray 函数。 转换过程中原始数组不会发生变化&#xff0c;而是返回一个新的数组。 二&#xff0c;多维数组 使用 Array of 函数创建多维数组&am…...

vmware、centos: 快照、redis集群克隆、启动异常

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 启动虚拟机报错&#xff1a; 指定的虚拟磁盘需要进行修复 打不开磁盘“D:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位-000001.vmdk”或它所依赖的某个快照磁盘。 模块“Disk”启动失败。 未能启动虚拟机…...

visual studio断点无法进入

问题背景&#xff1a; 使用VSQt进行编码&#xff0c;新增函数处断点无法进入。 问题排查 查看moc文件&#xff0c;汇编代码以及设置调试选项均不生效。 原因分析 之前无意间进行了排版优化&#xff0c;导致新增的代码未正常编译进去&#xff0c;通过“文件-> 高级保存选…...

CNVD-2025-06046:Google Chrome沙箱逃逸漏洞大揭秘与防护指南

CNVD-2025-06046&#xff1a;Google Chrome沙箱逃逸漏洞大揭秘与防护指南 前言&#xff1a;浏览器界的“越狱”事件 嘿&#xff0c;小伙伴们&#xff01;今天咱们要聊的不是什么好莱坞大片&#xff0c;而是一出在浏览器世界里真实上演的“越狱”大戏&#xff01;你没听错&…...

androd的XML页面 跳转 Compose Activity 卡顿问题

解决 XML 点击跳转到 Compose Activity 卡顿问题 当从 XML 布局的 Activity 跳转到 Compose Activity 时出现卡顿现象&#xff0c;这通常是由以下几个原因导致的&#xff1a; 可能的原因及解决方案 1. Compose 首次初始化开销 问题&#xff1a;Compose 框架首次初始化需要时…...

Springboot同时支持不同的数据库,Oracle,Postgresql

关键字 Java&#xff0c;Springboot&#xff0c;Vscode&#xff0c;支持多种数据库 背景环境 我在实际项目开发工程中遇到这样一个问题&#xff0c;用户 A 使用 Oracle 数据库&#xff0c;用户 B 使用 Postgresql 数据库&#xff0c;但是用户 AB 都使用我们的项目。所以项目…...

【计网】TCP协议的拥塞控制与流量控制

拥塞控制与流量控制的区别 流量控制 流量控制主要是控制端到端&#xff08;发送端和接收端&#xff09;之间的数据传输量&#xff0c;是局部的机制。 目的&#xff1a;防止发送方发送数据过快导致接收方来不及处理实现方式&#xff1a;通过滑动窗口机制&#xff0c;接收方通…...

Redis - 字典(Hash)结构和 rehash 机制

字典结构 Redis中的字典由dict.h/dict结构表示: typedef struct dict ( //类型特定函数dictType *type;//私有数据 void "privdata;//哈希表 dictht ht[2];//rehash索引 //当rehash不在进行时,值为-1 in trehashidx; } dict; Redis字典所使用的哈希表由dict.h/dictht 结…...

Redis 与 MongoDB 对比分析

Redis 与 MongoDB 对比分析 1. 核心定位 Redis&#xff1a;内存键值数据库&#xff0c;侧重高性能读写和低延迟&#xff0c;常用于缓存、实时分析、消息队列等场景。MongoDB&#xff1a;分布式文档型数据库&#xff0c;侧重灵活的数据模型和大规模数据存储&#xff0c;支持复…...

【愚公系列】《高效使用DeepSeek》058-选题策划

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

解决 Lettuce 在 Redis 集群模式下的故障转移问题

引言 在高可用系统中&#xff0c;故障转移是确保服务不中断的重要机制。当我们使用 Lettuce 作为 Redis 的 Java 客户端时&#xff0c;如何高效地处理故障转移成为一项关键任务。本篇文章将探讨如何在 Redis 集群模式下配置 Lettuce 以优化故障转移。 背景 在初期设置 Lettu…...

Vim搜索和替换

模式 命令模式 操作过程 键入/开始搜索&#xff0c;找到想要搜索的内容后直接回车&#xff0c;此时光标会从搜索框回到编辑器中。 之后可以 使用小写n跳到下一个符合条件的内容&#xff0c;使用大写N跳到上一个搜索的内容。也可以直接使用上下左右按钮调整光标位置。...

【探商宝】 Llama 4--技术突破与争议并存的开源多模态

核心亮点 混合专家架构&#xff08;MoE&#xff09;的全面应用 Llama 4 是 Meta 首个全系列采用 MoE 架构 的模型&#xff0c;通过稀疏激活机制显著提升效率。例如&#xff1a; Llama 4 Scout&#xff08;中杯&#xff09;&#xff1a;16 位专家&#xff0c;17B 活跃参数&#…...

可发1区的超级创新思路(python 实现):一种轻量化的动态稀疏门控网络

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用领域 视频异常检测、生成视频检测。 二、模型解析 该模型由1.关键帧动态选择机制、2.关键帧动态选择机制以及3.关键帧动态选择机制三大核心组件构成,形成端到端的视频异常…...

flink cdc的source数据流如何配置事件时间,如何设置时间语义,分配时间戳并生成水位线

在 Flink CDC 中为 Source 数据流配置事件时间需要结合时间语义设置、时间戳分配和水位线生成三个核心步骤。以下是具体配置方法及注意事项&#xff1a; 1. 设置时间语义 Flink 默认使用处理时间&#xff08;Processing Time&#xff09;&#xff0c;需显式指定事件时间语义&a…...

Vue3:初识Vue,Vite服务器别名及其代理配置

一、创建一个Vue3项目 创建Vue3项目默认使用Vite作为现代的构建工具&#xff0c;以下指令本质也是通过下载create-vue来构建项目。 基于NodeJs版本大于等于18.3&#xff0c;使用命令行进行操作。 1、命令执行 npm create vuelatest输入项目名称 2、选择附加功能 选择要包含的功…...

医疗场景与事件驱动的高匹配颗粒度医疗智能体研发方向探析(代码版)

结合技术实现、应用场景与挑战展开分析: 一、医疗场景驱动的智能体核心方向 全场景覆盖的诊疗辅助医疗智能体系统编程方案 1.1、技术架构设计 #mermaid-svg-OKB0oAt38jXWNClG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…...

HTML5 浏览器兼容性:让旧浏览器也能拥抱 HTML5

在前端开发领域&#xff0c;HTML5 带来了一系列令人兴奋的新特性和功能&#xff0c;极大地提升了用户体验和开发效率。然而&#xff0c;由于互联网用户使用的浏览器版本千差万别&#xff0c;部分旧版本浏览器并不支持 HTML5&#xff0c;这给开发者带来了兼容性方面的挑战。不过…...

Kubernetes 集群搭建(三):使用dashboard用户界面(需要访问外网获取yaml)

&#xff08;一&#xff09;简介 K8s Dashboard是Kubernetes提供的一种基于Web的用户界面工具&#xff0c;用于可视化地管理和监控Kubernetes集群 主要功能&#xff1a; 资源查看与管理&#xff1a; 查看Kubernetes集群中的各种资源&#xff0c;如节点、Pod、服务、部署等。 对…...

【图像处理基石】什么是ISP色彩管理?

在ISP&#xff08;Image Signal Processor&#xff0c;图像信号处理器&#xff09;管线中&#xff0c;色彩管理是图像处理流程的核心环节&#xff0c;主要负责从传感器原始数据&#xff08;RAW&#xff09;到最终输出图像&#xff08;如YUV、RGB或JPEG&#xff09;的色彩转换、…...

金融维度下的公链价值重构:重塑财富新秩序

公链的引言&#xff1a; 众人对 Crypto、Token 的探讨热度居高不下。在此大背景下&#xff0c;我打算另辟蹊径&#xff0c;从金融维度重新剖析区块链分布式账本。那么&#xff0c;我们究竟该如何正确认知它&#xff1f;又该如何搭建起一套从金融视角出发的分析框架呢&#xff1…...

LeetCode算法题(Go语言实现)_34

题目 考虑一棵二叉树上所有的叶子&#xff0c;这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 如果有两棵二叉树的叶值序列是相同&#xff0c;那么我们就认为它们是 叶相似 的。 如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的&#xff0c;则返回 true&…...

# 项目部署指南:Flask、Gradio与Docker实现流程

Python项目部署指南&#xff1a;Flask、Gradio与Docker实践 1. 引言 在机器学习和Web开发中&#xff0c;将模型或应用部署为在线服务是关键一步。本文将介绍如何使用 Flask 和 Gradio 快速构建前端界面&#xff0c;并通过 Docker 容器化实现高效部署&#xff0c;涵盖完整流程图…...

2022第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(题解解析)

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、九进制转十进制-&#xff08;解析&#xff09;-简单的进制转化问题&#x1f604; 2、顺子日期-&#xff08;解析&#xff09;-考察日期 3…...

UML之序列图的参与者与生命线

序列图是建模过程中必选的一种描述行为的手段&#xff0c;它展示在某些有用的行为中元素之间的消息交换和相互作用。交互是构成行为的一个单元&#xff1b;这些元素必须是可连接元素&#xff0c;通常将这些可连接元素称为交互中的参与者&#xff08;Participants&#xff09;。…...

基于Python Flask快速构建网络安全工具资源库的Web应用实践

引言 在网络安全领域&#xff0c;信息收集&#xff08;OSINT&#xff09;是渗透测试、漏洞挖掘和威胁分析的关键环节。然而&#xff0c;面对海量工具和分散的技术文档&#xff0c;安全研究人员常需耗费大量时间查找和比对工具信息。本文将介绍如何利用 Python Flask HTML 技…...

xv6-labs-2024 lab1

lab-1 注&#xff1a;实验环境在我的汇编随手记的末尾部分有搭建教程。 0.前置 第零章 xv6为我们提供了多种系统调用&#xff0c;其中&#xff0c;exec将从某个文件里读取内存镜像(这确实是一个好的说法)&#xff0c;并且将其替换到调用它的内存空间&#xff0c;也就是这个…...

HTTP Form v.s. Flask-WTF Form v.s. Bootstrap Form

在Flask-WTF和Bootstrap 的Form创建中,添加了页面显示Flash Messages。 相比Flask_WTF, Bootstrap用 render_form(form)渲染样式,自动带错误提示,不需要像Flask_WTF那样手写 for error in ... 。 项目结构: register_app/ ├── HTTP_Form_App.py ├── FlaskWTF_Form…...

Linux网络编程——https的协议及其加密解密方式

目录 一、前言 https协议 常见的加密方式 1、对称加密 2、非对称加密 3、数字签名 1. 只用对称加密 2、只用单一的非对称加密 3、双方都使用非对称加密 4、非对称加密对称加密 证书 证书颁发流程 服务器与客户端的证书验证流程 5、证书非对称加密对称加密 前言 上一…...

Node.js 下载与安装(图文)

下载 官网&#xff1a;【直达&#xff1a;https://nodejs.org/en/】。 点击【Download】&#xff0c;选择【版本&#xff0c;系统】。点击【Windows Installer(.msi)】。 安装 双击【.msi文件】&#xff0c;选择【安装路径】&#xff0c;也可以一直【下一步】。 查看版本 …...

3.31-4.06 Web3 游戏周报:Pebble 玩家留存率登顶,Treasure DAO 面临重组危机

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.31–4.06】Web3 游戏行业动态 链游生态系统 Treasure DAO 因财务危机面临重组&#xff0c;将终止游戏运营和 Treasure Chain3A 链游 Shrapnel 开发商 Neon Machine 深陷财务…...

echarts生成3D立体地图react组件

地图散点图效果&#xff1a; react项目中安装echarts、echarts-gl依赖&#xff1a; npm install echarts echarts-gl 文件目录结构&#xff1a; 地图组件map目录下文件代码&#xff0c;点击散点图圆点触发事件handleCityClick&#xff1a; index.jsx&#xff1a; import { …...

Node.js 中处理 Excel 文件的最佳实践

在现代应用开发中&#xff0c;Excel 文件仍然是数据交换和存储的重要格式之一。在 Node.js 环境中&#xff0c;处理 Excel 文件的需求日益增加。本文将介绍如何在 Node.js 中高效地处理 Excel 文件&#xff0c;涵盖工具选择、基本操作和最佳实践。 1. 选择合适的库 在 Node.js…...

解决Ubuntu系统鼠标不流畅的问题

电脑是联想的台式组装机&#xff0c;安装ubuntu系统&#xff08;不管是16、18、20、22&#xff09;后&#xff0c;鼠标都不流畅。最近几天想解决这个问题&#xff0c;于是怀疑到了显卡驱动上。怀疑之前一直用的是集成显卡&#xff0c;而不是独立显卡&#xff0c;毕竟2060的显卡…...

【Linux】虚拟机设置静态IP

主播我今天下午学了几节微服务课&#xff0c;上课的时候&#xff0c;直接把手机拿走了去上课&#xff08;电脑连的我手机的热点&#xff09;&#xff0c;虚拟机没关&#xff0c;晚上主播我回来继续学&#xff0c;电脑连上热点之后&#xff0c;发现虚拟机连接不上了&#xff0c;…...

Web API:AbortController

Web API&#xff1a;AbortController 主要用途基本工作原理基本用法示例高级用例1. 实现请求超时2. 取消多个请求3. 与其他异步 API 一起使用 浏览器支持总结 主要用途 AbortController 是一个 Web API&#xff0c;主要用于取消一个或多个 Web 请求&#xff08;如 fetch 请求&…...