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

C++:继承与多态详解

文章目录1. 继承1.1 继承的概念1.2 继承方式1.3 基类和派生类的转换1.4 继承中的作用域1.5 类可以不被继承吗1.6 基类包含static函数1.7 多继承与菱形继承问题1.7 虚继承2. 多态2.1 多态的构成条件2.2 虚函数2.2.1 虚函数的重写/覆盖2.3 析构函数的重写2.4 override 和 final 关键字2.5 重载/重写/隐藏2.6 纯虚函数和抽象类2.7 虚函数表2.8 多态原理2.9 动态绑定与静态绑定1. 继承1.1 继承的概念核心定义继承是一个类派生类 / 子类复用、扩展另一个类基类 / 父类的成员变量和成员函数的机制。也就是一个类可以使用另一个类的成员变量和函数。举个例子#includeiostream#includestringusing namespace std;class person{protected:string name;intage;public:person(string name,intage):name(name),age(age){}stringwname(){returnthis-name;}intwage(){returnage;}};class student:public person//这里表示继承{protected:string id;public:student(string name,intage,string id):person(name,age),//调用父类构造id(id){}stringwid(){returnid;}};intmain(){studenta(赛罗,20000,16班);couta.wid()endl;couta.wname()endl;couta.wage()岁endl;}在这个代码中student就是子类派生类public就是继承方式person就是父类基类。1.2 继承方式类成员/继承方式public继承protected继承private继承基类的 public 成员派生类的 public 成员派生类的 protected 成员派生类的 private 成员基类的 protected 成员派生类的 protected 成员派生类的 protected 成员派生类的 private 成员基类的 private 成员在派生类中不可见在派生类中不可见在派生类中不可见简而言之private成员在子类中不可见无法访问但确实是被继承了所以我们一般用protected,protected 就是为了继承而设计的访问权限,外部不可见但子类可见public与protected唯一的区别就是继承后的protected成员对外依旧是隐藏的工程实践中public 继承是主流选择protected/private继承因会隐藏基类接口、丧失is-a语义与多态性扩展性差故极少使用且不推荐。1.3 基类和派生类的转换public继承的派生类对象 可以赋值给 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中基类那部分切出来基类指针或引用指向的是派生类中切出来的基类那部分。基类对象不能赋值给派生类对象。基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。三种情况Person*ptr;// 基类指针只能“看见”Person部分Student s;// 派生类对象完整的学生ptrs;// ✅ 合法指针指向s的Person部分ptr-show();//假设父类子类都有个void show(),这里只能调用Person的成员函数访问不到Student的内容这里就是把子类的show()给切出来了。基类对象不能赋值给派生类对象。Person p;Student sp;// ❌ 编译报错Student s;// 真正的派生类对象Person*ps;// 基类指针指向派生类对象// 安全强转回 Student*Student*s1(Student*)p;s1-id2026001;// ✅ 能正常访问派生类成员如果基类指针不指向派生类对象就不行Person p;// 纯基类对象Person*ptrp;// 基类指针指向基类对象// 危险强转成 Student*Student*s2(Student*)ptr;s2-id2026001;// ❌ 访问非法内存程序崩溃1.4 继承中的作用域在继承体系中基类和派生类都有独立的作用域。派生类和基类中有同名成员派生类成员将屏蔽基类对同名成员的直接访问这种情况叫隐藏。在派生类成员函数中可以使用 基类::基类成员 显示访问需要注意的是如果是成员函数的隐藏只需要函数名相同就构成隐藏。注意在实际中在继承体系里面最好不要定义同名的成员。class Person{protected:string _name赛罗;// 姓名int_num111;// ⾝份证号};class Student:public Person{public:voidPrint(){cout 姓名:_nameendl;cout 身份证号:Person::_numendl;cout 学号:_numendl;//这里两个_num就构成隐藏}protected:int_num999;// 学号};intmain(){Student s1;s1.Print();return0;};这里特别声明隐藏后的函数是找不到的一旦调用编译器找不到就会报错。1.5 类可以不被继承吗法1派生类的构造函数必须调用基类的构造函数来初始化基类部分。如果基类的构造函数是 private派生类就无法访问它也就无法实例化派生类对象从而实现 “不能被继承”。class NoInherit{private:// 私有化构造函数NoInherit(){}friend NoInheritCreateNoInherit();};// 友元函数可以调用私有构造用来创建对象NoInheritCreateNoInherit(){returnNoInherit();}// 尝试继承会编译报错class Derived:public NoInherit{// ❌ 无法访问基类的私有构造函数};intmain(){// 可以通过友元创建基类对象NoInherit objCreateNoInherit();// Derived d; // ❌ 编译失败return0;}法2final 关键字是 C11 新增的特性专门用来禁止类被继承语法更简洁是现代 C 中推荐的写法。// 用 final 修饰类禁止继承class NoInherit final{public:NoInherit()default;};// 尝试继承会直接编译报错// class Derived : public NoInherit { // ❌ 编译失败// };intmain(){NoInherit obj;// ✅ 可以正常创建对象return0;}外加友元关系不能被继承基类友元不能访问派生类私有和保护成员。1.6 基类包含static函数静态成员的本质是属于类本身而不是某个对象。基类定义了 static 成员后它就独立存在不随任何对象创建 / 销毁而改变派生类继承后只是获得了访问这个静态成员的权限并不会复制一份新的静态成员所以不管派生出多少个派生类整个体系里始终只有这一个静态成员实例1.7 多继承与菱形继承问题多继承顾名思义就是继承多个父类class Person{...};class Teacher{...};class Assistant:public Person,public Teacher{...};// 多继承内存模型特点继承顺序决定内存布局先继承的基类成员排在前面后继承的基类排在后面派生类自己的成员放在最后。菱形继承当两个派生类继承自同一个基类又有一个新类同时继承这两个派生类时就会形成菱形结构菱形继承的两大问题数据冗余Assistant 对象中会包含两份 Person 基类成员一份来自 Student一份来自 Teacher浪费内存。二义性访问 Person 的成员时编译器不知道该用哪一份副本直接访问会编译报错。建议强烈不建议设计菱形继承模型代码维护成本高容易出错。当然有解决方案————虚继承。1.7 虚继承本质虚继承的本质是让多个派生类共享同一份公共基类的成员而不是各自复制一份。当派生类声明为 virtual 继承公共基类时编译器会在派生类对象中通过虚基类指针指向一个共享的基类成员副本而不是复制多份。这样一来整个继承体系中公共基类的成员就只有一份实例彻底解决了数据冗余和二义性。#includeiostream#includestringusing namespace std;class Person{public:string _name;};// 虚继承class Student:virtual public Person{public:Student(){_name1;// 先赋值 1}};// 虚继承class Teacher:virtual public Person{public:Teacher(){_name2;// 后赋值 2}};// 多继承class Assistant:public Student,public Teacher{public:voidPrint(){cout_nameendl;}};intmain(){Assistant a;a.Print();// 输出多少// 你甚至可以从 Student 路径访问cout从Student访问a.Student::_nameendl;// 从 Teacher 路径访问cout从Teacher访问a.Teacher::_nameendl;return0;}结果2. 多态多态是什么简单说同一个行为不同对象做会有不同的表现。买票普通人全价、学生打折、军人优先动物叫猫 “喵”、狗 “汪汪”在C里多态分两种类型别名例子特点编译时多态静态多态函数重载、函数模板编译器在编译阶段就确定调用哪个函数运行时多态动态多态虚函数重写程序运行时根据对象的实际类型决定调用哪个函数2.1 多态的构成条件实现多态还有两个必须重要条件必须是基类的指针或者引用调用虚函数被调用的函数必须是虚函数并且完成了虚函数重写/覆盖。说明要实现多态效果第一必须是基类的指针或引用因为只有基类的指针或引用才能既指向基类对象又指向派生类对象第二派生类必须对基类的虚函数完成重写/覆盖重写或者覆盖了基类和派生类之间才能有不同的函数多态的不同形态效果才能达到。2.2 虚函数类成员函数前面加virtual修饰那么这个成员函数被称为虚函数。注意非成员函数不能加virtual修饰。class Person{public:virtualvoidBuyTicket(){cout买票-全价endl;}};2.2.1 虚函数的重写/覆盖虚函数的重写/覆盖派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同)称派生类的虚函数重写了基类的虚函数。注意在重写基类虚函数时派生类的虚函数在不加virtual关键字时虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性)但是该种写法不是很规范不建议这样使用不过在考试选择题中经常会故意买这个坑让你判断是否构成多态。#includeiostream#includestringusing namespace std;// 基类Personclass Person{public:// 加了 virtual这就是【虚函数】virtualvoidBuyTicket(){coutPerson全价买票endl;}};// 派生类Studentclass Student:public Person{public:// 函数名、参数、返回值 和 基类完全相同构成【虚函数重写】virtualvoidBuyTicket()override{// override 是C11的规范写法可选但强烈推荐coutStudent半价买票endl;}};// 派生类Soldierclass Soldier:public Person{public:// 同样重写了基类的虚函数virtualvoidBuyTicket()override{coutSoldier优先买票endl;}};// 多态的核心基类引用/指针接收不同对象voidDoBuy(Personp){p.BuyTicket();}intmain(){Person normal;Student stu;Soldier sol;DoBuy(normal);// 调用 Person::BuyTicket()DoBuy(stu);// 调用 Student::BuyTicket()DoBuy(sol);// 调用 Soldier::BuyTicket()return0;}2.3 析构函数的重写析构函数的特殊 “重写” 规则普通函数重写要求函数名、参数、返回值都必须完全一致。但析构函数不一样基类析构函数加了 virtual 后派生类的析构函数哪怕名字不同~A() vs ~B()也会被编译器特殊处理自动构成重写。原理编译器在编译时会把所有类的析构函数统一命名为 destructor所以它们能匹配上构成多态。为什么基类析构函数必须是虚函数关键考点举个例子当你用基类指针指向派生类对象然后 delete 它时不加 virtual只会调用基类的析构函数派生类的析构函数不会被执行 → 派生类中申请的资源比如动态内存无法释放 → 内存泄漏。加了 virtual触发多态会先调用派生类的析构函数再调用基类的析构函数 → 资源完全释放不会泄漏。#includeiostreamusing namespace std;class A{public:A(){pnewint;}// 关键加virtual析构函数成为虚函数virtual~A(){delete p;coutA::~A()endl;}private:int*p;};class B:public A{public:B(){qnewint;}// 派生类析构函数自动构成重写可加override规范写法~B()override{delete q;coutB::~B()endl;}private:int*q;};intmain(){A*pnewB();delete p;// 会先调用B::~B()再调用A::~A()资源完全释放return0;}2.4 override 和 final 关键字一、override 关键字给虚函数重写 “加个保险”作用明确标记派生类的函数是 “重写基类虚函数”让编译器帮你检查是否符合重写规则。核心价值解决手误导致的重写失败问题比如参数写错、返回值不匹配代码可读性更强一眼就能看出 “这是重写不是新函数”。class Base{public:virtualvoidfunc(intx){}};class Derive:public Base{public:// ✅ 正确写法用override标记重写virtualvoidfunc(intx)override{// 重写逻辑}// ❌ 错误示例参数写错编译器会直接报错// virtual void func(double x) override {}};二 final 关键字final在继承有禁止继承的功能在修饰虚函数有禁止重写的功能。基类的虚函数加了 final 后派生类不能再重写它。class Base{public:virtualvoidfunc()final{}// 禁止派生类重写};class Derive:public Base{public:// ❌ 编译报错无法重写final虚函数// virtual void func() override {}};2.5 重载/重写/隐藏2.6 纯虚函数和抽象类在虚函数的后面写上 0则这个函数为纯虚函数纯虚函数不需要定义实现(实现没啥意义因为要被派生类重写但是语法上可以实现)只要声明即可。包含纯虚函数的类叫做抽象类抽象类不能实例化出对象如果派生类继承后不重写纯虚函数那么派生类也是抽象类。纯虚函数某种程度上强制了派生类重写虚函数因为不重写实例化不出对象。virtualvoidFunc()0;// 纯虚函数核心作用强制派生类必须重写该函数否则派生类也会变成抽象类无法实例化。为多态提供一个统一的接口规范让不同派生类实现各自的逻辑。抽象类的规则定义包含至少一个纯虚函数的类就是抽象类。关键限制抽象类不能实例化对象无法用 new 或直接定义创建对象。如果派生类继承抽象类后没有重写所有纯虚函数那么派生类依然是抽象类同样不能实例化。#includeiostreamusing namespace std;// 抽象类包含纯虚函数class Animal{public:// 纯虚函数强制派生类实现“叫”这个行为virtualvoidSpeak()0;virtual~Animal()default;};// 派生类猫必须重写 Speakclass Cat:public Animal{public:voidSpeak()override{cout喵~endl;}};// 派生类狗必须重写 Speakclass Dog:public Animal{public:voidSpeak()override{cout汪汪endl;}};intmain(){// Animal a; // ❌ 抽象类不能实例化Animal*catnew Cat;Animal*dognew Dog;cat-Speak();// 输出喵~dog-Speak();// 输出汪汪delete cat;delete dog;return0;}2.7 虚函数表定义每个包含虚函数的类的对象都会额外包含一个隐藏的指针成员就是虚函数表指针。它指向这个对象所属类的虚函数表。32 位程序中占 4 字节64 位程序中占 8 字节。它通常在对象内存布局的最开头。那么虚函数表有什么用呢每个有虚函数的类会自动生成一张虚函数表 vtable表里存的是虚函数的地址每个对象内部隐藏一个 vfptr 虚表指针指向自己类的虚表继承 重写时子类会复制父类虚表只要子类重写了虚函数✅ 虚表中对应位置的函数地址直接替换成子类函数地址调用时通过对象的 vfptr 找到自己真实的虚表查表运行时拿到子类函数地址调用子类方法。#includeiostreamusing namespace std;// 父类class Person{public:// 加 virtual → 产生虚函数表virtualvoidbuy(){cout全价买票endl;}};// 子类class Student:public Person{public:// 重写虚函数子类虚表会替换该函数地址voidbuy()override{cout半价买票endl;}};intmain(){// 父类指针 指向 子类对象Person*pnew Student;// 靠【虚函数表】运行时找子类的函数p-buy();delete p;return0;}2.8 多态原理编译时生成虚函数表只要类中定义了虚函数编译器就会为该类生成一张虚函数表vtable表中存储了所有虚函数的地址。Person 类的虚表存储 Person::BuyTicket 的地址Student 类的虚表存储 Student::BuyTicket 的地址重写后会覆盖基类的地址运行时动态查表调用当通过基类指针 / 引用调用虚函数如 ptr-BuyTicket()时程序不会在编译阶段就绑定固定的函数地址而是通过对象内部的虚函数表指针vfptr找到该对象所属类的虚函数表。从虚函数表中取出对应虚函数的地址。调用该地址对应的函数。最终效果当 ptr 指向 Person 对象时查表调用 Person::BuyTicket当 ptr 指向 Student 对象时查表调用 Student::BuyTicket从而实现了同一个调用语句根据对象的实际类型自动执行不同的函数逻辑这就是多态的本质。子类的虚函数表 复制父类的虚表内容但是 一张全新的、独立的表子类对象的 vfptr 指向这张新表和父类指针不一样2.9 动态绑定与静态绑定对不满足多态条件(指针或者引用调用虚函数)的函数调用是在编译时绑定也就是编译时确定调用函数的地址叫做静态绑定。满足多态条件的函数调用是在运行时绑定也就是在运行时到指向对象的虚函数表中找到调用函数的地址也就做动态绑定。动态绑定的核心是当通过基类指针/引用调用虚函数时程序不会在编译期写死函数地址而是在运行时通过对象内部的虚表指针vptr找到其所属类的虚函数表vtable再根据函数在表中的索引取出对应的函数地址并调用从而实现“同一个调用语句根据对象真实类型自动执行不同版本函数”的多态效果。#includeiostreamusing namespace std;class Person{public:virtualvoidBuyTicket(){coutPerson买全价票endl;}};class Student:public Person{public:voidBuyTicket()override{coutStudent买半价票endl;}};// 动态绑定的调用场景voidFunc(Person*ptr){// 这句就是典型的动态绑定运行时查表调用ptr-BuyTicket();}intmain(){Person p;Student s;Func(p);// ptr指向Person对象Func(s);// ptr指向Student对象return0;}

相关文章:

C++:继承与多态详解

文章目录1. 继承1.1 继承的概念1.2 继承方式1.3 基类和派生类的转换1.4 继承中的作用域1.5 类可以不被继承吗1.6 基类包含static函数1.7 多继承与菱形继承问题1.7 虚继承2. 多态2.1 多态的构成条件2.2 虚函数2.2.1 虚函数的重写/覆盖2.3 析构函数的重写2.4 override 和 final 关…...

双像素深度估计与去模糊:Dual Pixel 传感器 AI 实战

文章目录 双像素深度估计与去模糊:Dual Pixel 传感器 AI 实战 一、原理 二、深度估计 2.1 视差深度公式 2.2 深度估计模型 三、去模糊模型 3.1 数据 3.2 去模糊网络 3.3 训练 3.4 推理 四、结果 五、优势对比 六、适用场景 七、总结 代码链接与详细流程 购买即可解锁1000+YOLO…...

AI代码助手实战指南:从GitHub Copilot到Cursor,提升开发效率

1. 从零到一:构建你的AI代码助手实战指南如果你是一名开发者,最近几个月一定被各种AI编程工具刷屏了。从GitHub Copilot在代码行间弹出的智能建议,到Cursor IDE那种“用对话写代码”的颠覆性体验,再到Claude Code在终端里直接帮你…...

教程太碎总失败?这篇Claude Code配置文:从Node.js到API调用一篇搞定(亲测跑通)(Windows系统)

前言 最近AI代码工具更新太快,很多教程刚出来就过时,尤其是Claude Code这类工具,环境配置和API对接总让新手头疼——不是Node.js版本不对,就是海外接口连不上,折腾半天还是报错。 其实核心问题就两个:一是…...

sklearn多核机器学习性能优化实战指南

1. 为什么需要多核机器学习?在数据科学项目中,我们经常遇到这样的场景:当数据集规模达到GB级别时,使用sklearn的默认设置训练模型就像用老牛拉卡车。我曾经在一个电商用户行为预测项目中,单核训练一个随机森林需要近2小…...

MobileNetV3 医学病理分类:卷积分类头 + 迁移学习

文章目录 MobileNetV3 医学病理分类:卷积分类头 + 迁移学习 一、架构 二、环境 三、数据 3.1 结构 3.2 加载 四、模型 五、训练 六、推理 七、结果 八、卷积分类头 vs 全连接分类头 九、冻结 vs 微调对比 十、总结 代码链接与详细流程 购买即可解锁1000+YOLO优化文章,并且还有…...

机器学习超参数优化:网格搜索与随机搜索对比

1. 函数优化中的搜索策略概述在机器学习和数值计算领域,函数优化是一个基础而关键的问题。我们经常需要找到使目标函数取得最小值或最大值的参数组合。当目标函数的解析性质未知或计算复杂度高时,系统化的参数搜索策略就显得尤为重要。两种最直观的搜索方…...

Arm A-profile架构缓存子系统与写回机制解析

1. Arm A-profile架构缓存子系统深度解析在处理器架构设计中,缓存子系统对系统性能有着决定性影响。Arm A-profile架构作为移动计算和嵌入式领域的标杆,其缓存设计哲学体现了性能与能效的完美平衡。最新发布的Arm Architecture Reference Manual for A-p…...

深度学习中评估指标计算库TorchMetrics的使用

TorchMetrics是一个包含100多个PyTorch指标实现的集合(如分类、检测、分割、回归等),并提供易于使用的API来创建自定义指标。可以将TorchMetrics与任何PyTorch模型或PyTorch Lightning结合使用。源码地址:https://github.com/Lightning-AI/torchmetrics&…...

Flutter 鸿蒙跨端开发实战:集成三方库实现鸿蒙设备 TODO 清单应用

欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net 本文专为鸿蒙入门开发者打造,以可直接运行的 TODO 清单项目为实战案例,手把手教你用 Flutter 跨端框架开发鸿蒙应用,全程包含Flutter 核心配置、三方库集…...

coze(扣子)5分钟产出爆火短视频操作详解

以前想做个短视频,得先拍摄,然后用PR、喀秋莎等专业软件剪辑,即使用后来面世的会声会影、剪映这类快捷软件,也得操作上一阵子。不过现在各种AI生成视频智能体层出不穷,大大降低了普通人玩短视频的门槛。今天送上一个使…...

47.网络基础

看课件,网络基础网络是操作系统一部分。多个局域网构成广域网。...

Unsloth Sglang Vllm核心区别和使用场景

(一)核心总结 Unsloth:主打「微调/训练加速」,推理只是附带 vLLM:通用推理引擎,主打「高吞吐、高显存利用率」 SGLang:推理引擎,主打「前缀复用、结构化输出、低延迟」 下面从定位、核心技术、性能、适用场景四个维度拆开讲。 一、定位 1. Unsloth 定位:微调优先、推…...

微信AI双开方案:HermesClaw实现iLink协议代理与多AI助手集成

1. 项目概述:一个微信账号,两个AI大脑如果你和我一样,既想体验 Hermes Agent 在代码生成和逻辑推理上的强大能力,又舍不得 OpenClaw 在文件处理和日常对话上的贴心与便捷,那么你肯定也遇到了那个让人头疼的问题&#x…...

AI 编程神器:MonkeyCode 使用心得 —— 重塑开发效率,

我使用 MonkeyCode 的心得分享 大家好!作为一名热爱编程刚入门不久的新手,我想分享一下我最近使用 MonkeyCode 的心得。MonkeyCode 是一款基于人工智能的编程辅助工具,它彻底改变了我的编码体验。从安装到日常使用,整个过程流畅无…...

ImageNet挑战赛:计算机视觉革命的里程碑

1. 计算机视觉领域的"奥林匹克":ImageNet挑战赛全景解读2010年那个闷热的夏天,当李飞飞教授团队首次发布ImageNet大规模视觉识别挑战赛(ILSVRC)时,恐怕没人能预料到这个比赛会成为引爆AI革命的导火索。作为计…...

Transformer跳跃连接:原理、实现与优化实践

1. 跳跃连接的本质与价值 在Transformer架构中,跳跃连接(Skip Connection)早已不是新鲜概念,但它的实际价值常常被低估。我第一次在Vision Transformer项目中系统性地测试不同位置的跳跃连接效果时,意外发现合理配置的…...

Weaviate向量数据库实战:从部署到多模态搜索与生产优化

1. 从零开始:理解Weaviate与向量数据库的核心价值 如果你正在机器学习和AI应用领域摸索,尤其是在处理文本、图像、音频这类非结构化数据时,一定绕不开一个核心问题:如何快速、准确地找到“相似”的内容?传统的基于关键…...

网络初级第五次作业(真机实验配置)

一、实验要求二、实验步骤1. 实验扩扑图2. 配置VLANSW1和SW2:SW3和SW4:3. 配置DHCP服务为PC1和PC2应用DHCP服务并查询IP地址4. 配置OSPF动态路由三、实验结果PC1与PC2通过DHCP动态获取IP地址,三层设备间运行OSPF动态路由协议,PC1可成功ping通PC2&#xf…...

Hugo博客自动化发布:基于OpenClaw的智能工作流实践

1. 项目概述与核心价值作为一名长期维护个人技术博客的开发者,我深知从写作到发布的流程中,那些看似微小却极其消耗心力的“最后一公里”问题。你可能也遇到过:写完一篇精心打磨的 Markdown 文章后,还需要手动编写 Hugo 的 Front …...

深度学习在影评情感分析中的应用与实践

1. 项目概述:基于深度学习的影评情感分析影评情感分析是自然语言处理(NLP)领域的经典任务,也是商业场景中应用最广泛的文本分类技术之一。我在多个电商和社交平台的内容分析系统中都实践过类似方案。这个项目的核心是通过深度学习…...

神经网络基础:从 RNN 的局限到 Transformer 的巅峰

前言 在第一课和第二课中,我们掌握了全连接网络和卷积网络(CNN)。全连接层擅长处理静态特征,卷积层擅长处理空间特征(图像)。 然而,当面对序列数据(如一句话、一段音频&#xff09…...

零基础秒落地!魔珐星云打造专属法务数字人

本次项目聚焦企业内部法务服务场景,依托魔珐星云具身智能数字人开放平台,打造专属企业法务数字人,简化交互形式,仅支持文字输入对话、数字人播报功能,适配企业内部法务咨询、内容传递需求。 项目开发简洁高效&#xf…...

杨校老师课堂之栈结构的专项训练

括号匹配 题目描述 假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如()或[([][])]等为正确的匹配,[(])或(或(()))均为错误的匹配 本题的任务是检验一个给定的表达式中的括号是否匹配正确 输入一个只包含圆括号和方括号的字…...

项目实训——Werewolf-Agent 多智能体狼人杀中DSPy应用优化器优化

一、前言 上周,我在我们的项目中引入了dspy并使用它进行一个简单的测试,在测试过程中,我进行了几局游戏,发现预言家每次的输出结果都相差不大,这让我在玩起来比较无趣,因为在每个阶段,我都可以…...

2.3.2_3浮点数的加减运算(舍入问题)

IEEE754定义的4种舍入模式:舍入模式例子:0舍:1入:100类型:...

PR曲线绘制超简单

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 PR曲线绘制超简单:从入门到自动化实战指南 目录 PR曲线绘制超简单:从入门到自动化实战指南 引言&#xff…...

【无人艇】基于matlab自适应多目标优化的UUV全覆盖路径规划【含Matlab源码 15379期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…...

Linux USB驱动架构与性能优化实战

1. Linux USB驱动架构深度解析在嵌入式系统开发中,USB驱动作为连接主机与外围设备的关键桥梁,其性能直接影响整个系统的I/O效率。以TI的DaVinci平台为例,其USB驱动实现展现了Linux内核中USB子系统的典型架构与优化技巧。1.1 核心架构分层Linu…...

Python异常检测算法实战:隔离森林与LOF应用解析

1. 异常检测的核心价值与挑战在数据分析的实际场景中,异常点就像沙滩上的珍珠——它们可能代表最有价值的信息,也可能是需要剔除的噪声。我在金融风控领域第一次意识到异常检测的重要性,当时一个看似微小的数据异常背后隐藏着数百万美元的欺诈…...