从父类到子类:C++ 继承的奇妙旅程(2)
前言:
各位代码航海家,欢迎回到C++继承宇宙!上回我们解锁了继承的「基础装备包」,成功驯服了public
、protected
和花式成员隐藏术。但——
⚠️前方高能预警: 继承世界的暗流涌动远不止于此!今天我们将勇闯三大神秘海域:
-
多继承の百慕大三角 👻——当你的类同时认了两个"爹"
-
虚继承の量子纠缠 ⚛️——专治"菱形继承"引发的时空悖论
-
继承构造/析构の连锁反应 💥——比《信条》更烧脑的逆向工程
准备好你的IDE光剑和调试护盾,我们即将潜入继承深渊!
🎮 本关Boss预告
class 爷爷 {}; class 爸爸1 : virtual public 爷爷 {}; // 虚继承! class 爸爸2 : virtual public 爷爷 {}; class 你 : public 爸爸1, public 爸爸2 {}; // 多继承の最终形态!
灵魂拷问:
-
当
爷爷
的遗产被爸爸1
和爸爸2
重复继承时,你
会继承几份祖传代码? -
为什么祖师爷要发明"虚继承"这种黑科技?
-
构造函数们究竟在继承链上玩什么接力赛?
(摸鱼提示:文末附赠「菱形继承生存指南」,保你跳出编译错误的黑洞!)
☕ 建议装备
-
咖啡因补给包 ×1
-
防止指针错乱的思维导图 ×1
-
暂时忘记Java/Python的勇气 ×1
⚡ 3秒后进入继承下篇—— 程序员,你是否选择「接受挑战」?
(按下F5继续执行代码...🚀)
1.派生类的默认成员函数
1.1.四个常见的默认成员函数
通过之前的学习,我们知晓,C++有六种默认构造函数,忘记的或者是不知晓的读者可以看我之前写过的初始C嘎嘎的文章,那里详细记载了,当然,主要的默认成员函数其实有四种:构造函数、拷贝构造函数、赋值运算符重载,析构函数默认的意思指的是我们不写,编译器会帮我们自动生成一个,那么在派生类中,这四种函数又是如何生成的呢?
1.派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。其实我们可以把基类当做是一个自定义类型的成员变量,众所周知,自定义类型的成员变量会调用自己的默认构造函数,如果没有默认构造函数的时候,编译器就会报错,必须显示的去调用构造函数。而基类的默认构造也和这个类似,大多数情况我们都是不需要自己调用构造函数的,当然,不排除我们没写默认构造函数,那么它的用法如下所示:
class Person
{
public:Person(const string& name) :t_name(name) //这里就用一个正常的构造函数,但不是默认构造函数{}
protected:string t_name;
};
class Student :public Person
{
public:Student(const string& _t_name,const string& name) : Person(_t_name),_name(name) //直接调用其父类的构造函数即可,当做整体进行构造{}
protected:string _name;
};
2.派生类对象初始化先调用基类构造再调派生类构造。这个很好去理解,因为基类是比派生类的成员变量出现的早的,所以出现最早的优先调用构造函数,所以先调用基类的构造在调用子类的构造。
3.派生类的拷贝构造函数必须调用基类的拷贝构造来完成基类的拷贝初始化。这个也是比较好理解的,因为拷贝构造需要我们传入对应的对象,不像默认构造函数那样有缺省值直接调用缺省值就好,所以它要求我们去显示的调用拷贝构造,这里的知识和我们第一篇继承的知识联系在了一起,不知道读者是否还记得“切片”,也就是public继承的派生类对象可以赋值给基类的指针 / 基类的引用。也就是如下图所示:
此时我们仅需在派生类的拷贝构造函数中传入派生类对象的引用,并且基类的拷贝构造函数的参数必须是基类的引用,此时我们就可以通过切片把派生类对象中基类的一部分切给要进行拷贝构造的派生类的基类部分了,可谓是非常的优美。下面我将通过一个例子让各位了解用法。
class Person
{
public:Person(Person& s1):t_name(s1.t_name){}
protected:string t_name;
};
class Student :public Person
{
public:Student(Student& s1): Person(s1),_name(s1._name) //直接把对象传到基类即可{}
protected:string _name;
};
4.派生类的operator=必须要调用基类的operator=完成基类的复制。需要注意的是派生类的operator=隐藏了基类的operator=,所以显示调用基类的operator=,需要指定基类作用域。这个为什么显示调用和拷贝构造是一样的,这里我就不详说了,不过这里也是牵扯到了上篇博客的一个小知识点:隐藏的知识,当函数名相同的时候,并且函数分别属于基类的作用域和派生类的作用域时,那么此时就是构成了隐藏关系。而基类和子类的赋值运算符重载名字是一模一样的,所以构成了隐藏关系,此时我们需要指定类域才可以调用基类的赋值运算符重载,它的用法如下所示:
class Person
{
public:Person& operator=(const Person& s1){t_name = s1.t_name;return *this;}
protected:string t_name;
};
class Student :public Person
{
public:Student& operator=(const Student& s1){Person::operator=(s1); //一定要指明基类的作用域_name = s1._name;return *this;}
protected:string _name;
};
5.派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。这个也是牵扯到了我们第一次初学C++类和对象的时候学到的知识:后定义的先析构,因为派生类的成员是后来定义的,所以它是最开始析构的,所以我们先清理派生类的成员函数,在进行基类成员的清理。当然,析构函数我们最好还是不要显示的调用,至于为何,请看第七点。
6.派生类对象析构清理先调用派生类析构再调基类的析构。这个上面解释了,我就不细说了。
7.因为多态中一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们多态章节会讲解)。那么编译器会对析构函数名进行特殊处理,处理成destructor(),所以基类析构函数不加virtual的情况下,派生类析构函数和基类析构函数构成隐藏关系。所以我的建议就是析构函数我们还是老老实实的让派生类自己去调用基类的析构函数吧,这样比较方便。
各位读者,看到这里是不是手痒想当"代码界的灭霸"了?别急着敲继承的响指!今天咱们要聊的C++贵族礼仪——如何让类在族谱上写下"此脉单传,永不加粗"!
想打造这种孤高の王族血统?可不是给构造函数上锁那么简单(那招就像在城堡门口挂"内有恶犬",防得住新手防不住杠精)。C++11早给我们准备了基因改造药剂——final关键字!这玩意儿比皇后的毒苹果还好使:
1.2.实现一个不能被继承的类
方法一
不知道各位读者是否还记得我上篇文章所讲述的继承方式,基类使用private成员限定符限定的成员是不可以被派生类使用的,那么这就相当于不可以被派生类继承(当然,还是继承下来的,只不过不允许使用)了。所以当我们让基类的构造函数被private限定以后,那么此时派生类就无法调用基类的默认构造函数,从而导致派生类无法实例化出对象,这就意味这个类是无法被继承的。如下所示:
class Person
{
private:Person() {}
};
class Studnet : public Person
{
public:Studnet() {}
public:
};
不过这个做法是有点不优美的,因为它有个致命的缺陷:“家贼难防”,如果给派生类悄悄的开一个后门:friend通行证(友元),那么此时派生类依然可以调用基类的拷贝构造函数:
class 薛定谔的保险箱 {
private:薛定谔的保险箱() {}friend class 量子穿墙术; // 偷偷塞钥匙
};
class 量子穿墙术 : public 薛定谔的保险箱 { // 竟然成功继承!科学伦理委员会震怒
};
这个方法的局限性很大,所以准确来说:通过私有化构造函数可以制造伪·不可继承类,但需要配合杜绝friend后门,而C++11的final关键字才是正宗的绝育手术刀~(≧∇≦)/~(这就是方法二)。
方法二
C++11新增加了一个关键字:final关键字,final修改基类,那么派生类就无法继承了,它的用法如下所示:
class Person final
{
public:Person() {}
};
class Studnet : public Person
{
public:Studnet() {}
public:
};
2.继承和友元
友元关系不能继承,也就是说基类友元不能访问派生类私有和保护成员。这个很好理解,下面我就一个有趣的例子来给各位说明一下:
class 祖传咸鱼配方 { // 传男不传女的独门秘方
private:int 祖传盐量 = 999; // 传家宝级别的盐值friend class 大厨; // 授予传功长老权限
};
class 改良版咸鱼配方 : public 祖传咸鱼配方 {
private: int 科技盐量 = 666; // 偷偷加了海克斯科技
};
class 大厨 {
public:void 烹饪秘术(祖传咸鱼配方& 老坛) {老坛.祖传盐量 = 9527; // 畅通无阻(毕竟有friend通行证)}
void 黑暗料理(改良版咸鱼配方& 新品) {// 新品.科技盐量 = 1314; // 报错!编译器怒斥:你只是他爹的基友!}
};
// 剧情彩蛋:就算逆天改命也不行!
class 逆子配方 : public 祖传咸鱼配方 {friend class 大厨; // 试图继承爹的社交圈
private:int 叛逆盐量 = 233;
};
// 大厨试图搞事情:
void 偷天换日() {逆子配方 黑化版;黑化版.叛逆盐量 = 666; // 依然报错!编译器冷笑:父辈的friend不是你的ATM机!
}
这波操作生动诠释了:
-
友元关系比钢铁直男还直——绝不拐弯继承(派生类不会自动获得基类友元)
-
友元权限比小区门禁还严——只认身份证原件(即便派生类主动示好,基类友元也摸不到派生类的私有成员)
-
想开后门?除非上演《无间道》——在派生类里重新声明friend(但这样可就背叛革命了)
3.继承和静态成员
基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个派生类,都只有一个static成员实例。通过一个简单的例子就可以知晓这个定义:
class 魔法始祖 {
public:static int 魔力源泉; // 全魔法界共享的充电宝
};
int 魔法始祖::魔力源泉 = 100; // 在霍格沃茨地窖初始化
class 火系法师 : public 魔法始祖 {};
class 水系法师 : public 魔法始祖 {};
class 风系法师 : public 魔法始祖 {};
int main() {火系法师 甘道夫;水系法师 梅林;风系法师 萨尔;
// 所有法师共享同一个魔法池甘道夫.魔力源泉 += 50; // 火法师给充电宝续费cout << 梅林.魔力源泉 << endl; // 输出150(水系躺着蹭网)萨尔.魔力源泉 -= 70; // 风系法师偷偷下载小电影cout << 魔法始祖::魔力源泉 << endl; // 输出80(祖宗家底被败光)// 见证奇迹的时刻!cout << &甘道夫.魔力源泉 << " ←火法地址\n"<< &梅林.魔力源泉 << " ←水法地址\n"<< &萨尔.魔力源泉 << " ←风法地址" << endl;// 三个地址完全相同,实锤共享内存
}
这段代码生动诠释了:
-
静态成员就像家族银行账户——所有子孙刷的都是同一张卡
-
无论通过基类还是派生类访问,操作的都是同一个内存地址
-
任一派生类搞事情,全家族成员都要背锅(值同步变化)
4.多继承以及其菱形继承问题
4.1.继承模型
单继承:一个派生类只有一个直接基类时称这个继承关系为单继承。这个是比较好理解的,因为它的定义就和它的名字一样,下面我给出示例图:
单继承算是一个比较正常的继承了,但是如果单继承变为了多继承,那么会很逆天!
(敲黑板)各位程序员请注意,咱们今天要聊的是C++里的"多重身份危机"——多继承和它的狗血连续剧"菱形继承"!
第一幕:多继承の修罗场
想象一下,你是个时间管理大师:
class 社畜 : public 打工人, public 乙方舔狗, public 深夜码农 {};
这就是多继承——一个类同时认多个爹。内存布局就像叠罗汉,谁先继承谁在下面:
[打工人] → [乙方舔狗] → [深夜码农] → [社畜的私人数据]
但问题来了——如果多个爹有同名成员,编译器直接懵逼:
社畜 张三;
张三._存款 = -10086; // 编译器怒吼:你三个爹都有存款,我该改哪个?!
第二幕:菱形继承の家族伦理剧
来看这张祖传关系图:
结果Assistant继承时,老祖宗的基因复制了两份!这就是菱形继承的血泪史:
Assistant 小王;
小王.Student::_name = "学渣";
小王.Teacher::_name = "教授";
// 实际小王体内住着两个老祖宗,精分现场!
内存布局宛如祖传玉佩摔成两半:
[Student版Person] → [Teacher版Person] → [Assistant数据]
此时访问_name
就像问妈妈和老婆掉水里救谁——必须指定爹名:
cout << 小王.Student::_name; // "学渣"
cout << 小王.Teacher::_name; // "教授"
第三幕:虚继承の公证处协议
C++祭出大招:虚继承!相当于给老祖宗做公证:
class Student : virtual public Person {}; // 公证声明
class Teacher : virtual public Person {}; // 同上
此时孙辈的内存布局变成:
[虚表指针] → [Student数据] → [虚表指针] → [Teacher数据] → [老祖宗Person] → [Assistant数据]
虽然解决了数据冗余,但代价是:
-
构造顺序堪比宫廷剧——孙辈得直接给老祖宗上供:
Assistant::Assistant() : Person("工具人"), Student(), Teacher() {} // 必须亲自初始化老祖宗
-
访问速度像去公证处盖章——多绕一层指针
终幕:多继承の终极考题
来看这道送命题:
Basel b1; Base2 b2;
class 缝合怪 : public Basel, public Base2 {};
缝合怪 obj;
Basel* p1 = &obj;
Base2* p2 = &obj;
void* p3 = &obj;
指针地址关系是?
-
A: p1 == p2 == p3 ❌(想得美)
-
B: p1 < p2 < p3 ❌(内存不是等差数列)
-
C: p1 == p3 != p2 ✅(Basel先继承,地址最低)
-
D: p1 != p2 != p3 ❌(p3和p1指向同一起点)
总结陈词: 多继承就像同时认多个干爹——给钱时很爽,争家产时头大。而菱形继承则是家族内斗的终极形态,虚继承虽然能维稳,但操作难度堪比处理婆媳关系。珍爱生命,远离菱形!(Java笑而不语)
4.2.彩蛋:IO库中的菱形虚拟继承
其实我们日常使用iostream库就是一个菱形虚拟继承,其结构图如下所示:
5.继承和组合
各位读者请注意,最后咱们要聊的是面向对象界的"婆媳关系"——继承和组合!这可是代码界的"到底该听妈的还是听媳妇的"终极难题!
第一回合:继承——代码界的家族企业
继承就像你爹开公司,你直接当太子爷继承皇位:
class 富二代 : public 土豪爹 {// 自动获得爹的别墅、跑车、黑卡
};
优点:
-
是亲生的(is-a关系),直接拿爹的全部家当(包括私房钱)
-
白嫖式开发(白箱复用),连爹的日记本都能翻
缺点:
-
爹改遗嘱(修改基类),儿子当场破产(代码爆炸)
-
耦合度堪比连体婴,爹感冒儿子必发烧
经典翻车现场:
class 爹 {
public:void 传家宝() { cout << "洛阳铲"; }
};
class 儿子 : public 爹 {};
// 某天爹考古入魔:
class 爹 {
public:void 传家宝() { cout << "盗墓笔记"; } // 从工具升级成知识
};
// 儿子:???我铲子呢???
第二回合:组合——代码界的乐高大师
组合就像自己开公司,雇个专业经理人:
class 打工人 {class 肝帝程序员 员工; // 组合一个996战士class AWS云服务器 设备; // 再组个烧钱神器
};
优点:
-
是老板(has-a关系),只关心KPI(接口),不管员工私生活(黑箱复用)
-
耦合度堪比塑料友情,随时换掉摸鱼员工(维护性好)
经典操作:
class 特斯拉 {Battery 电池; // 想换宁德时代?换!Motor 电机; // 想用国产?换!Autopilot 智驾; // 想用华为?换!(马斯克震怒)
};
// 组合就是:没有什么是换零件解决不了的
第三回合:继承 vs 组合の世纪对决
对比项 | 继承 | 组合 |
---|---|---|
关系 | 你是我儿子(is-a) | 你是我工具人(has-a) |
耦合度 | 脐带级绑定 | 点赞之交 |
封装性 | 爹的内裤都被看光 | 打码级保护 |
改需求伤害 | 家族式团灭 | 换个零件就能活 |
适用场景 | "狗是动物"这种铁律 | "车有轮胎"这种可拆卸关系 |
终极大招:面向对象の生存法则
-
能组合就别继承——少认爹少背锅,多个爹多个坟头
-
非要继承时:
-
确认关系铁如"企鹅是鸟"(虽然它不会飞)
-
准备迎接"爹动一下,儿改十行"的刺激生活
-
-
多态是继承の免死金牌——当你要召唤"虚函数"神龙时,该认爹还得认
总结陈词:
-
继承像结婚——高风险高回报,且行且珍惜
-
组合像恋爱——合则来不合则换,自由无负担
-
记住:代码不是血缘关系,少继承,多组合,你的头发会感谢你!
6.总结
本文到这里也就结束喽,今天我们完成了继承的全部内容的讲解,下面我简单的总结一下本文讲解的内容。
本章节の知识点爆米花
-
默认成员函数:四个"祖传家产"(构造/拷贝/析构/赋值),教你如何打造C++界的丁克家族(final大法)
-
继承与友元:塑料兄弟情——基类友元不会遗传,就像你爹的兄弟不会给你压岁钱!
-
静态成员:全家族共享的祖传充电宝(static),一人改参数,全家炸电路
-
多继承:修罗场の生存指南——内存布局叠罗汉,菱形继承精分现场,虚继承公证处の骚操作
-
组合vs继承:认爹不如雇工具人(has-a),代码界的乐高哲学——宁可多拼积木,少背族谱
前方高能预警
你以为继承的狗血剧这就结束了?Too young!下一章我们将迎来面向对象三幻神の最终形态——多态!
届时您将看到:
-
虚函数:C++版的"我变秃了也变强了"
-
动态绑定:运行时の分身术,让对象学会影流之主の秘技
-
纯虚函数:抽象类の"画饼大法",堪比老板的年终奖承诺
-
多态の黑暗面:虚表指针の内存迷踪,性能刺客の背刺警告
(剧透小剧场)
class 打工人 {
public:virtual void 摸鱼() = 0; // 老板:这是纯虚函数,你必须实现!
};
class 程序员 : public 打工人 {
public:void 摸鱼() override { cout << "在GitHub刷绿格子" << endl; // 老板:这TM也算工作?!}
};
};
准备好迎接"一个接口,千种姿势"的神奇世界了吗?下期我们将用多态实现:同一行代码,白天当社畜,晚上变蝙蝠侠的魔法操作!(≧∇≦)ノ
各位大佬下篇文章见啦!
相关文章:
从父类到子类:C++ 继承的奇妙旅程(2)
前言: 各位代码航海家,欢迎回到C继承宇宙!上回我们解锁了继承的「基础装备包」,成功驯服了public、protected和花式成员隐藏术。但—— ⚠️前方高能预警: 继承世界的暗流涌动远不止于此!今天我们将勇闯三大…...
ScaleTransition 是 Flutter 中的一个动画组件,用于实现缩放动画效果。
ScaleTransition 是 Flutter 中的一个动画组件,用于实现缩放动画效果。它允许你对子组件进行动态的缩放变换,从而实现平滑的动画效果。ScaleTransition 通常与 AnimationController 和 Tween 一起使用,以控制动画的开始、结束和过渡效果。 基…...
部署RocketMQ
部署环境:jdk8以上,Linux系统 下载和安装指令: wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip 显示下载成功: --2025-05-10 11:34:46-- https://archive.apache.org/dist/rocketm…...
从爬虫到网络---<基石9> 在VPS上没搞好Docker项目,把他卸载干净
1.停止并删除所有正在运行的容器 docker ps -a # 查看所有容器 docker stop $(docker ps -aq) # 停止所有容器 docker rm $(docker ps -aq) # 删除所有容器如果提示没有找到容器,可以忽略这些提示。 2.删除所有镜像 docker images # 查看所有镜像 dock…...
每日c/c++题 备战蓝桥杯(P2241 统计方形(数据加强版))
洛谷P2241 统计方形(数据加强版)题解 题目描述 给定一个 n m n \times m nm 的方格棋盘,要求统计其中包含的正方形数量和长方形数量(不包含正方形)。输入为两个正整数 n n n 和 m m m,输出两个整数分…...
LLaVA:开源多模态大语言模型深度解析
一、基本介绍 1.1 项目背景与定位 LLaVA(Large Language and Vision Assistant)是由Haotian Liu等人开发的开源多模态大语言模型,旨在实现GPT-4级别的视觉-语言交互能力。该项目通过视觉指令微调技术,将预训练的视觉编码器与语言模型深度融合,在多个多模态基准测试中达到…...
基于Spring Boot + Vue的母婴商城系统( 前后端分离)
一、项目背景介绍 随着母婴行业在互联网平台的快速发展,越来越多的家庭倾向于在线选购母婴产品。为了提高商品管理效率和用户购物体验,本项目开发了一个基于 Spring Boot Vue 技术栈的母婴商城系统,实现了商品分类、商品浏览、资讯展示、评…...
HNUST湖南科技大学-软件测试期中复习考点(保命版)
使用说明:本复习考点仅用于及格保命。软件测试和其他专业课不太一样,记忆的太多了,只能说考试的时候,想到啥就写啥,多写一点!多写一点!多写一点!(重要事情说三遍…...
【AI智能推荐系统】第七篇:跨领域推荐系统的技术突破与应用场景
第七篇:跨领域推荐系统的技术突破与应用场景 提示语:🔥 “打破数据孤岛,实现1+1>2的推荐效果!深度解析美团、亚马逊如何用跨领域推荐技术实现业务协同,知识迁移核心技术全公开!” 目录 跨领域推荐的商业价值跨领域推荐技术体系 2.1 基于共享表征的学习2.2 迁移学习…...
【现代深度学习技术】注意力机制04:Bahdanau注意力
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
使用FastAPI和React以及MongoDB构建全栈Web应用01 概述
Are you ready to craft digital experiences that captivate and convert? 您准备好打造令人着迷并能带来转变的数字体验了吗? In a world driven by innovation, the demand for robust and scalable web applications has never been higher. Whether you’re…...
Flutter - UIKit开发相关指南 - 概览
环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 概览 UIView与Widgets的比较 在UIKit使用UIView类的对象进行页面开发,布局也是UIView类的对象,在Flutter中使用的是Widget,在概念上Widget可以理解成UIView。 差异: 有效期: Widgets是不可变的,它的生存期只…...
扩容 QCOW2 磁盘镜像文件
🌈 个人主页:Zfox_ 目录 ✅ 一、扩展 QCOW2 文件大小✅ 二、启动虚拟机后扩展分区和文件系统方式一:如果使用的是标准分区(如 /dev/vda1)方式二:使用 gparted(图形工具) ✅ 总结 &am…...
【ts】for in对象时,ts如何正确获取对应的属性值
第一种:for…in keyof:适合需要遍历对象属性键并动态访问值的场景。 keyof typeof obj是ts的类型操作符,用于获取对象obj的所有属性键的联合类型(“name” | “age” | “city”)通过obj[key keyof typeof obj]&…...
软考 系统架构设计师系列知识点之杂项集萃(55)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(54) 第89题 某软件公司欲开发一个Windows平台上的公告板系统。在明确用户需求后,该公司的架构师决定采用Command模式实现该系统的界面显示部分,并设计UML类图如…...
绑定 SSH key(macos)
在 macOS 上绑定 Gitee 或 GitHub 的 SSH Key,通常分为以下几步操作,包括生成 SSH key、添加到 ssh-agent,并配置到 Gitee 或 GitHub 平台。 1. 检查是否已有 SSH Key ls -al ~/.ssh 看看是否已有 id_rsa 或 id_ed25519 等文件。如果没有就…...
PyTorch API 6 - 编译、fft、fx、函数转换、调试、符号追踪
文章目录 torch.compiler延伸阅读 torch.fft快速傅里叶变换辅助函数 torch.func什么是可组合的函数变换?为什么需要可组合的函数变换?延伸阅读 torch.futurestorch.fx概述编写转换函数图结构快速入门图操作直接操作计算图使用 replace_pattern() 进行子图…...
Unreal 从入门到精通之VR常用操作
文章目录 前言1.如何设置VRPawn视角的位置。2.如何播放视频3.如何播放VR全景视频。4.如何打开和关闭VR模式。前言 我们使用Unreal5 开发VR 项目的时候,会遇到很多常见问题。 比如: 1.如何设置VRPawn视角的位置。 2.如何播放视频。 3.如何播放VR全景视频。 4.如何打开和关闭V…...
Dify使用总结
最近完成了一个Dify的项目简单进行总结下搭建服务按照官方文档操作就行就不写了。 进入首页之后由以下组成: 探索、工作室、知识库、工具 探索: 可以展示自己创建的所有应用,一个应用就是一个APP,可以进行测试使用 工作室包含…...
事务连接池
一、事务概述 (一)事务的定义 事务是数据库提供的一种特性,用于确保数据操作的完整性和一致性。事务将多个数据操作组合成一个逻辑单元,这些操作要么全部成功,要么全部失败。 (二)事务的特性…...
如何用AWS Lambda构建无服务器解决方案:实战经验与场景解析
一、为什么开发者都在关注Serverless? 一、为什么开发者都在关注Serverless? 在云计算高速发展的今天,“无服务器架构”正成为技术新宠。根据Gartner预测,到2025年全球将有50%企业采用Serverless技术。而作为无服务器领域的领头…...
Android Compose 框架物理动画之捕捉动画深入剖析(29)
Android Compose 框架物理动画之捕捉动画深入剖析 一、引言 在 Android 应用开发中,动画是提升用户体验的关键元素之一。它能够让界面更加生动、交互更加自然。Android Compose 作为新一代的声明式 UI 框架,为开发者提供了强大且灵活的动画能力。其中&…...
Jmeter中的Json提取器如何使用?
在JMeter中使用JSON提取器可以方便地从JSON格式的响应数据中提取特定字段的值。以下是详细步骤和示例: 1. 添加JSON提取器 右击目标HTTP请求 -> 选择 添加 -> 后置处理器 -> JSON提取器。 2. 配置JSON提取器参数 变量名称(Names of created…...
STM32中断
STM32 GPIO外部中断简图 中断向量表 定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址 中断向量表定义在启动文件,当发生中断,CPU会自动执行对应的中断服务函数 中断向量表以及中断函数 NVIC嵌套向量中断控制…...
navicat 如何导出数据库表 的这些信息 字段名 类型 描述
navicat 如何导出数据库表 的这些信息 字段名 类型 描述 数据库名字 springbootmt74k 表名字 address SELECT COLUMN_NAME AS 字段名,COLUMN_TYPE AS 类型,COLUMN_COMMENT AS 描述 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA springbootmt74k AND TABLE_NAME a…...
LangGraph(三)——添加记忆
目录 1. 创建MemorySaver检查指针2. 构建并编译Graph3. 与聊天机器人互动4. 问一个后续问题5. 检查State参考 1. 创建MemorySaver检查指针 创建MemorySaver检查指针: from langgraph.checkpoint.memory import MemorySavermemory MemorySaver()这是位于内存中的检…...
数仓-可累计,半累加,不可累加指标,是什么,举例说明及解决方案
目录 1. 可累计指标定义:举例:解决方案: 2. 半累加指标定义:举例:解决方案: 3. 不可累加指标定义:举例:解决方案: 4. 总结对比5. 实际场景中的注意事项 这是数据仓库设计…...
Java ClassLoader双亲委派机制
Java ClassLoader双亲委派机制 1 什么是双亲委派模型 “类加载体系”及ClassLoader双亲委派机制。java程序中的 .java文件编译完会生成 .class文件,而 .class文件就是通过被称为类加载器的ClassLoader加载的,而ClassLoder在加载过程中会使用“双亲委派…...
upload-labs靶场通关详解:第四关
一、分析源代码 可以看出这一关仍然是黑名单验证,但是它禁止了更多的后缀。像php3,php4这类后缀也被加入了黑名单,第三关的方法在这里显然就失效了。那么我们想一想,既然配置文件中存在将php3当作php来执行的功能,那么…...
Webug4.0通关笔记25- 第30关SSRF
目录 一、SSRF简介 1.SSRF原理 2.渗透方法 二、第30关SSRF渗透实战 1.打开靶场 2.渗透实战 (1)Windows靶场修复 (2)Docker靶场修复 (3)获取敏感文件信息 (4)内网端口与服务…...
【 Redis | 实战篇 缓存 】
目录 前言: 1.认识缓存 2.添加Redis缓存 2.1.根据id查询商铺缓存 2.2.优化根据id查询商铺缓存 3.缓存更新策略 3.1.三种策略 3.2.策略选择 3.3.主动更新的方案 3.4. Cache Aside的模式选择 3.5.最佳实践方案 4.缓存三大问题 4.1.缓存穿透 4.1.1.介绍 …...
数字果园管理系统的设计与实现(Tensorflow的害虫识别结合高德API的害虫定位与Websocket的在线聊天室)
文章目录 技术栈主要功能害虫识别与定位害虫识别的实现训练与测试评估代码模型转化为TFLite预测脚本PredictController预测控制器害虫识别过程展示 害虫定位实现害虫定位代码害虫定位过程展示 专家咨询功能在线咨询聊天室主要前端代码如下主要后端代码如下 技术栈 Spring Boot…...
信息检索(包含源码)
实验目的 掌握逻辑回归模型在二分类问题中的应用方法熟悉机器学习模型评估指标PR曲线(精确率-召回率曲线)和ROC曲线(受试者工作特征曲线)的绘制与分析学习使用Python的scikit-learn库进行数据预处理、模型训练与评估理解特征选择…...
【金仓数据库征文】金仓数据库KingbaseES: 技术优势与实践指南(包含安装)
目录 前言 引言 一 : 关于KingbaseES,他有那些优势呢? 核心特性 典型应用场景 政务信息化 金融核心系统: 能源通信行业: 企业级信息系统: 二: 下载安装KingbaseES 三:目录一览表: 四:常用SQL语句 创建表: 修改表结构…...
Java数据结构——二叉树
二叉树 树的概念二叉树满二叉树和完全二叉树二叉树的性质二叉树的遍历 题目练习前序遍历中序遍历后序遍历 前言 已经知道了数据结构中的线性结构,那有没有非线性结构呢? 当然有就像我们文件夹,一个文件夹中有有另一个文件夹,这就是…...
用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本2
在版本1中,虽然系统能够满足基本需求,但随着连接数的增加和处理请求的复杂度上升,性能瓶颈逐渐显现。为了进一步提升系统的稳定性、并发处理能力以及资源的高效利用,版本2引入了三个重要功能:客户端连接池、服务器长连…...
drf 使用jwt
安装jwt pip install pyJwt 添加登录url path("jwt/login",views.JwtLoginView.as_view(),namejwt-login),path("jwt/order",views.JwtOrderView.as_view(),namejwt-order), 创建视图 from django.contrib.auth import authenticateimport jwt from jw…...
202536 | KafKa生产者分区写入策略+消费者分区分配策略
KafKa生产者分区写入策略 1. 轮询分区策略(Round-Robin Partitioning) 轮询分区策略 是 Kafka 默认的分配策略,当消息没有指定 key 时,Kafka 会采用轮询的方式将消息均匀地分配到各个分区。 工作原理: 每次生产者发…...
《自动驾驶封闭测试场地建设技术要求》 GB/T 43119-2023——解读
目录 一、标准框架与核心内容 二、重点技术要求 三、实施要点与建议 四、实施时间与参考依据 原文链接:国家标准|GB/T 43119-2023 (发布:2023-09-07;实施:2024-01-01) 一、标准框架与核心内容 适用范围…...
【C++ Qt】容器类(GroupBox、TabWidget)内附思维导图 通俗易懂
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” ✍️绪论: 本章主要介绍了 Qt 中 QGroupBox 与 QTabWidget 控件。QGroupBox 是带标题的分组框,能容纳其他控件,有标题、对齐方式、是否…...
【SpringBoot】从环境准备到创建SpringBoot项目的全面解析.
本篇博客给大家带来的是SpringBoot的知识点, 包括Idea的干净卸载… 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要…...
基于ESP32控制的机器人摄像头车
DIY Wi-Fi 控制的机器人摄像头车:从零开始的智能探索之旅 在当今科技飞速发展的时代,机器人技术已经逐渐走进了我们的生活。今天,我将带你一起探索如何制作一个 Wi-Fi 控制的机器人摄像头车,它不仅可以远程操控,还能通…...
Excel图表 vs 专业可视化工具:差距有多大?内容摘要
你是不是还在用 Excel 做图表,觉得它已经够用了?但你知道吗,Excel 和专业的可视化工具之间其实有着巨大的差距!Excel 是办公必备,但它的图表功能真的能满足复杂的数据展示需求吗?而那些听起来高大上的专业可…...
Nacos源码—7.Nacos升级gRPC分析三
大纲 5.服务变动时如何通知订阅的客户端 6.微服务实例信息如何同步集群节点 5.服务变动时如何通知订阅的客户端 (1)服务注册和服务订阅时发布的客户端注册和订阅事件的处理 (2)延迟任务的执行引擎源码 (3)处理客户端注册和订阅事件时发布的服务变动和服务订阅事件的处理 (…...
量化学习DAY2-开始批量提交alpha!
量化学习第二天笔记 一、World Quant平台的Alpha概念 在World Quant平台中,alpha本质上是一个数学公式,它是**operator(操作)与Data(数据)**的组合。 (一)Data相关 Data…...
【Qwen3_ 4b lora xinli 】 task完成实践记录
task 我需要 基于llamafactory框架选取基本上相同的数据集用lora微调Qwen3_ 4b两次并保存lora参数然后分别合并这两个lora参数到基座模型。再换个数据集上接着进行微调。并且保存新的lora参数,然后我们匹配这里面的特征值和特征向量,如果这两个新的lora…...
文旅田园康养小镇规划设计方案PPT(85页)
1. 项目背景与定位 背景:位于长三角经济圈,依托安吉丰富的自然与文化资源,旨在打造集康养、度假、文化体验于一体的综合小镇。 定位:成为浙北地区知名的康养旅游目的地,融合“一溪两岸”规划理念,实现全面…...
[Windows] 能同时打开多个图片的图像游览器JWSEE v2.0
[Windows] 能同时打开多个图片的图像游览器JWSEE 链接:https://pan.xunlei.com/s/VOPpO86Hu3dalYLaZ1ivcTGIA1?pwdhckf# 十多年前收藏的能同时打开多个图片的图像游览器JWSEE v2.0,官网已没有下载资源。 JWSEE v2.0是乌鲁木齐金维图文信息科技有限公司…...
低成本自动化改造技术锚点深度解析
执行摘要 本文旨在深入剖析四项关键的低成本自动化技术,这些技术为工业转型提供了显著的运营和经济效益。文章将提供实用且深入的指导,涵盖老旧设备联网、AGV车队优化、空压机系统智能能耗管控以及此类项目投资回报率(ROI)的严谨…...
23盘古石决赛
一,流量分析 1. 计算流量包文件的SHA256值是?[答案:字母小写][★☆☆☆☆] 答案:2d689add281b477c82b18af8ab857ef5be6badf253db1c1923528dd73b3d61a9 解压出来流量包计算 2. 流量包长度在“640 - 1279”之间的的数据包总共有多少…...