万文c++继承
1、继承的概念与定义
1.1继承的概念
继承:是c++代码复用的手段,允许在原有的基础上扩展,在此之前都是函数层次的复用,继承是类设计层次的复用。
下面有两个类Student和Teacher都有姓名/地址/电话/年龄等成员变量。都有identity身份,设计到两个类⾥⾯就是冗余的。当然他们 也有⼀些不同的成员变量和函数,⽐如⽼师独有成员变量是职称,学⽣的独有成员变量是学号;学⽣ 的独有成员函数是学习,⽼师的独有成员函数是授课。
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:void identity() {}void study(){}
protected:string _name;string _address;string _tel;int _age;int _stuid;
};
class Teacher
{
public:void identity(){}void teaching(){}
protected:string _name;string _address;string _tel;int _age;int _stuid;
};
int main()
{return 0;
}
下⾯我们公共的成员都放到Person类中,Student和teacher都继承Person,就可以复⽤这些成员,就 不需要重复定义了,省去了很多⿇烦。
class Person
{
public:void identity() { }
protected:string _name="王五";string _address;string _tel;int _age;
};
class Student:public Person
{
public:void print(){cout << _name << endl;}void study() { }
protected:int _stuid;};
class Teacher:public Person
{
public:void teaching() { }
protected:string title;};
int main()
{Student s;s.print();return 0;
}
1.2 继承定义
1.2.1 定义下⾯我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以 既叫基类/派⽣类,也叫⽗类/⼦类)
1.2.2 继承基类成员访问⽅式的变化
如何记忆:记得权限大小 public>protected>private 起中private是最小的 所以它和谁配都小,成员变量存在但不能访问。由此可见谁小听谁的。
有一种最有趣,基类private成员在派⽣类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派⽣类 中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。 例子在第二个代码段。
1.3 继承类模板
如何实现用继承写一段栈呢
namespace bit
{//template<class T>//class vector//{};// stack和vector的关系,既符合is-a,也符合has-a template<class T>class stack : public vector<T>{public:void push(const T& x){// 基类是类模板时,需要指定⼀下类域, // 否则编译报错:error C3861: “push_back”: 找不到标识符// 因为stack<int>实例化时,也实例化vector<int>了 // 但是模版是按需实例化,push_back等成员函数未实例化,所以找不到 vector<T>::push_back(x);//push_back(x);}void pop(){vector<T>::pop_back();}const T& top(){return vector<T>::back();}bool empty(){return vector<T>::empty();}};
}
int main()
{bit::stack<int> st;st.push(1);st.push(2);st.push(3);while (!st.empty()){cout << st.top() << " ";st.pop();}return 0;
}
注意当我们想写一个通用的迭代器打印的时候,容易发生编译器困惑的错误❌。
在这段 C++ 模板代码里,typename
不加会报错,
是因为编译器无法确定 Container::const_iterator
究竟是类型还是成员变量 。
在 C++ 模板中,当模板未实例化时,编译器不知道模板参数 Container
具体是什么类型。Container::const_iterator
这种嵌套依赖类型(其具体类型依赖于 Container
),它有两种可能身份:
-
类型:在类似
std::vector
或std::list
这些标准容器中,const_iterator
是一种类型,用于定义常量迭代器,能遍历容器元素。 -
成员变量:假如
Container
是个自定义类,它里面恰好有个叫const_iterator
的成员变量,编译器在模板实例化前无法知晓。
编译器没办法在编译阶段,模板还没实例化、不知道 Container
确切类型的情况下,自动判断出 Container::const_iterator
到底是类型还是成员变量 。如果不明确告诉编译器它是类型,编译器就会困惑,不知道该怎么处理这行代码,进而报错 。
解决方法
1 typename:关键字就是专门用来告知编译器,它后面跟着的是一个类型 。
2 写auto 倒数第二个有讲解
2.基类和派⽣类间的转换
在C++中,公有继承的派生类对象可以赋值给基类的指针或引用,这种现象被称为切片(Slicing)/切割。
2.1 什么是切片?
想象你有一个完整的三明治(派生类对象),它包含面包(基类部分)、火腿、蔬菜和奶酪(派生类特有部分)。
当你将整个三明治递给一个只吃面包的人(基类指针/引用),他只会拿走面包部分,而火腿和奶酪会被“切掉”并丢弃。
这就是切片:基类指针或引用只能访问派生类对象中属于基类的部分,派生类特有的成员被“切无法通过基类接口访问。
#include <iostream>
using namespace std;// 基类:Animal
class Animal {
public:string name;int age;Animal(string n, int a) : name(n), age(a) {}
};// 派生类:Dog(公有继承Animal)
class Dog : public Animal {
public:string breed; // 派生类特有成员(品种)Dog(string n, int a, string b) : Animal(n, a), breed(b) {}
};int main() {Dog dog("Buddy", 3, "Golden Retriever");// 基类引用绑定到派生类对象(切片发生)Animal& animalRef = dog;Animal* animalPtr = &dog;Animal animal= dog;//在后面的基类拷贝构造有// 可以访问基类成员cout << "Name: " << animalRef.name << endl; // 输出:Buddycout << "Age: " << animalPtr->age << endl; // 输出:3// 无法访问派生类特有成员(编译错误)// cout << "Breed: " << animalRef.breed << endl; // 错误!// cout << "Breed: " << animalPtr->breed << endl; // 错误!return 0;
}
2.2为什么需要切片?
-
统一接口:将不同派生类对象统一视为基类对象处理,提高代码通用性。
例如:所有动物(基类)都可以调用eat()
,而具体实现由派生类(狗、猫)决定。 -
避免内存错误:强制类型安全,防止通过基类接口误操作派生类特有数据,没有临时变量参与。
2.3常见实例
函数参数传递
void printAnimal(const Animal& animal) {cout << "Name: " << animal.name << ", Age: " << animal.age << endl;
}int main() {Dog dog("Buddy", 3, "Golden Retriever");printAnimal(dog); // 传递派生类对象给基类引用(切片发生)
}
容器存储
vector<Animal> animals;
Dog dog("Buddy", 3, "Golden Retriever");
animals.push_back(dog); // 切片:容器中只存储Animal部分数据
3.继承中的作⽤域
3.1 独立作用域:基类和派生类各占山头
基类和派生类就像两个独立房间,各自定义的成员(变量/函数)默认只在各自房间可见。
class Base {
public:int a = 10;void print() { cout << "Base: " << a << endl; }
};class Derived : public Base {
public:int a = 20; // 隐藏基类的avoid print() { cout << "Derived: " << a << endl; } // 隐藏基类的print()
};
3.2 同名成员:派生类“盖住”基类
当基类和派生类有同名成员时,派生类成员会直接覆盖基类成员,如同用纸盖住桌上的字。
访问规则:
-
默认访问派生类成员。
-
要访问基类成员,需用
基类名::成员名
显式指明。Derived d; cout << d.a << endl; // 输出20(派生类的a) cout << d.Base::a << endl; // 输出10(显式访问基类的a) d.print(); // 调用派生类的print() d.Base::print(); // 显式调用基类的print()
3.3 函数隐藏:只看函数名,不管参数
- 只要函数名相同,无论参数是否相同,派生类函数都会隐藏基类所有同名函数。
class Base {
public:void func(int x) { cout << "Base::func(int)" << endl; }
};class Derived : public Base {
public:void func() { cout << "Derived::func()" << endl; }// 隐藏了Base::func(int)
};Derived d;
d.func(); // 正确:调用Derived::func()
// d.func(5); // 错误!基类的func(int)被隐藏
d.Base::func(5); // 正确:显式调用基类函数
3.4继承作⽤域相关选择题
3.2.1 A和B类中的两个func构成什么关系()
A. 重载 B. 隐藏 C.没关系
3.2.2 下⾯程序的编译运⾏结果是什么()
A. 编译报错 B. 运⾏报错 C. 正常运⾏
3.2.2当子类(
B
)定义了一个与父类(A
)同名的函数(无论参数是否相同),子类会隐藏父类的所有同名函数。因此:b.fun(10);走的是B,b.fun();走的也是B但是没有提供所以编译报错,运行报错是代码本身有语法问题。答案B. 隐藏 A. 编译报错
class A
{
public:void fun(){cout << "func()" << endl;}
};
class B : public A
{
public:void fun(int i){cout << "func(int i)" << i << endl;}
};
int main()
{B b;b.fun(10);b.fun();return 0;
};
4.继承中派生类的常见成员函数
4.1构造函数
1. 派生类构造函数必须调用基类构造函数
如果基类没有默认构造函数(即无参构造函数)派生类无需显示调用,但若没有默认构造有带参构造函数,派生类必须在初始化列表中显式调用基类的带参构造函数。
class Base {
public:Base(int value) : data(value) {} // 基类只有带参构造函数
private:int data;
};class Derived : public Base {
public:Derived(int baseValue, int derivedValue) : Base(baseValue), derivedData(derivedValue) {} // 显式调用基类构造
private:int derivedData;
};
2.派生类对象初始化顺序:基类构造→派生类构造
创建派生类对象时,先调用基类的构造函数,再调用派生类的构造函数。
class Base {
public:Base() { cout << "Base Constructor" << endl; }
};class Derived : public Base {
public:Derived() { cout << "Derived Constructor" << endl; }
};// 使用示例
int main() {Derived d;return 0;
}
- 基类部分必须在派生类部分初始化之前完成构造,因为派生类可能依赖基类的状态。
4.2拷贝构造
1.派生类拷贝构造函数必须调用基类拷贝构造函数
派生类的拷贝构造函数需要显式调用基类的拷贝构造函数,以复制基类部分的成员。
class Base {
public:Base(int value) : data(value) {}Base(const Base& other) : data(other.data) {} // 基类拷贝构造函数
private:int data;
};class Derived : public Base {
public:Derived(int value) : Base(value), derivedData(0) {}// 派生类拷贝构造函数Derived(const Derived& other) : Base(other), // 显式调用基类拷贝构造derivedData(other.derivedData) {}
private:int derivedData;
};
-
当创建
Derived
对象的拷贝时,Derived
的拷贝构造函数必须先调用Base
的拷贝构造函数,确保基类部分被正确复制。 -
若不显式调用
Base(other)
,基类部分将使用默认构造函数初始化(而非复制),导致数据丢失。 -
如果基类没有定义拷贝构造函数,编译器会自动生成一个浅拷贝的拷贝构造函数。
-
浅拷贝足够时:无需自定义拷贝构造函数(如基类只有值类型成员)。
-
深拷贝需求:若基类包含动态资源(如指针),必须自定义拷贝构造函数,否则会导致多个对象共享同一资源,析构时重复释放。
4.3赋值运算符
派生类的operator=
必须调用基类的operator=
派生类的赋值运算符需要显式调用基类的赋值运算符,以复制基类部分的成员。
class Base {
public:Base& operator=(const Base& other) {if (this != &other) {data = other.data;}return *this;}
private:int data;
};class Derived : public Base {
public:Derived& operator=(const Derived& other) {if (this != &other) {Base::operator=(other); // 显式调用基类赋值运算符derivedData = other.derivedData;}return *this;}
private:int derivedData;
};
-
派生类的
operator=
会隐藏基类的operator=
,因此必须通过Base::operator=(other)
显式调用基类的赋值逻辑。 -
若不调用,基类部分将不会被赋值,导致对象状态不一致。
-
如果基类没有定义赋值运算符,编译器会自动生成一个浅拷贝的赋值运算
4.4析构函数
1.派生类析构函数自动调用基类析构函数
派生类析构函数执行完毕后,会自动调用基类的析构函数,确保资源按 “派生类→基类” 的顺序释放。
class Base {
public:~Base() { cout << "Base Destructor" << endl; }
};class Derived : public Base {
public:~Derived() { cout << "Derived Destructor" << endl; }
};// 使用示例
int main() {Derived d; // 离开作用域时自动析构return 0;
}
-
派生类对象销毁时,先执行自身的析构函数(清理派生类资源),再自动调用基类的析构函数(清理基类资源)。
-
这种顺序确保资源释放的完整性,避免基类资源在派生类资源之前被释放。
2.派生类对象析构顺序:派生类析构→基类析构
class Base {
public:~Base() { cout << "Base Destructor" << endl; }
};class Derived : public Base {
public:~Derived() { cout << "Derived Destructor" << endl; }
};// 使用示例
int main() {Derived* d = new Derived();delete d; // 显式释放对象return 0;
}
操作 | 顺序 / 规则 | 关键原因 |
---|---|---|
构造函数 | 基类构造 → 派生类构造 | 派生类可能依赖基类初始化 |
拷贝构造函数 | 显式调用基类拷贝构造 | 确保基类部分被正确复制 |
赋值运算符 (operator= ) | 显式调用基类operator= | 避免基类部分未被赋值 |
析构函数 | 派生类析构 → 基类析构(自动调用) | 确保资源按正确顺序释放 |
4.5实现⼀个不能被继承的类
⽅法1:基类的构造函数私有,派⽣类的构成必须调⽤基类的构造函数,但是基类的构成函数私有化以后,派⽣类看不⻅就不能调⽤了,那么派⽣类就⽆法实例化出对象。
⽅法2:C++11新增了⼀个final关键字,final修改基类,派⽣类就不能继承了。
class Base final
{
public:void func5() { cout << "Base::func5" << endl; }
protected:int a = 1;
private:// C++98的⽅法/*Base(){}*/
};
class Derive :public Base
{void func4() { cout << "Derive::func4" << endl; }protected:int b = 2;
};
int main()
{Base b;Derive d;return 0;
}
5.继承和友元
#include <iostream>
using namespace std;class Base {
private:int baseSecret = 10; // 基类的私有成员
public:// 声明友元函数,允许访问基类的私有成员friend void visitBase(Base& b);
};class Derived : public Base {
private:int derivedSecret = 20; // 派生类的私有成员
};// 基类的友元函数
void visitBase(Base& b) {cout << "访问基类的秘密: " << b.baseSecret << endl; // 允许访问// cout << "尝试访问派生类的秘密: " << b.derivedSecret << endl; // 错误!无法访问
}int main() {Derived d;visitBase(d); // 合法,但只能访问基类的成员return 0;
}
如果想让友元访问派生类对象,就需要将派生类中加入友元。
6.继承与静态成员
派生类和基类共用一份静态成员变量。
#include<iostream>
using namespace std;
class Person
{
public:string _name;static int _count;
};
int Person::_count = 0;
class Student : public Person
{
protected:int _stuNum;
};
int main()
{Person p;Student s;// 这⾥的运⾏结果可以看到⾮静态成员_name的地址是不⼀样的// 说明派⽣类继承下来了,⽗派⽣类对象各有⼀份cout << &p._name << endl;cout << &s._name << endl;// 这⾥的运⾏结果可以看到静态成员_count的地址是⼀样的// 说明派⽣类和基类共⽤同⼀份静态成员cout << &p._count << endl;cout << &s._count << endl;// 公有的情况下,⽗派⽣类指定类域都可以访问静态成员cout << Person::_count << endl;cout << Student::_count << endl;return 0;
}
7. 多继承及其菱形继承问题
7.1继承模型




产生问题
-
数据冗余:公共基类成员在派生类中存在多份副本。
-
二义性:访问公共成员时,编译器无法确定路径。
class Person
{
public:string _name; // 姓名
};
class Student : public Person
{
protected:int _num; //学号
};
class Teacher : public Person
{
protected:int _id; // 职⼯编号
};
class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修课程
};
int main()
{// 编译报错:error C2385: 对“_name”的访问不明确Assistant a;a._name = "peter";// 需要显⽰指定访问哪个基类的成员可以解决⼆义性问题,但是数据冗余问题⽆法解决a.Student::_name = "xxx";a.Teacher::_name = "yyy";return 0;
}
7.2虚继承
解决菱形继承(钻石继承)中的两个核心问题:数据冗余和二义性。
-
Person
成员只保留一份,通过虚基表指针访问。
#include <iostream>
using namespace std;class Person {
public:string _name;Person(const string& name) : _name(name) {}
};class Student : virtual public Person { // 虚继承
public:Student(const string& name) : Person(name) {}
};class Teacher : virtual public Person { // 虚继承
public:Teacher(const string& name) : Person(name) {}
};class TeachingAssistant : public Student, public Teacher {
public:// 最终派生类必须调用虚基类构造函数TeachingAssistant(const string& name) : Person(name), Student(name), Teacher(name) {}
};int main() {TeachingAssistant ta("Alice");cout << ta._name << endl; // 直接访问,输出:Alicereturn 0;
}
不规则菱形在哪写virtual
7.3 小题
class Base1 { public: int _b1; };
class Base2 { public: int _b2; };
class Derive : public Base1, public Base2 { public: int _d; };
int main()
{Derive d;Base1* p1 = &d;Base2* p2 = &d;Derive* p3 = &d;return 0;
}
其中 P1是继承的第一个基类,P2是继承的第二个基类,p1与p3的位置相同P2将往后移。

7.4继承与组合
继承
-
继承表示派生类是基类的一种特殊类型,即“是一个(is-a)”的关系。
例如:狗是动物 →Dog
继承Animal
。
-
白箱复用:派生类可以直接访问基类的成员(包括保护成员),了解内部实现细节。
-
高耦合:基类改动可能影响所有派生类,维护成本高。
-
问题:继承破坏了基类的封装,鸡肋的 改变对派生类影响大,两者依赖性强,耦合度高。
class Animal {
public:void breathe() { cout << "呼吸中..." << endl; }
};class Dog : public Animal { // Dog is-a Animal
public:void bark() { cout << "汪汪!" << endl; }
};int main() {Dog dog;dog.breathe(); // 继承自Animaldog.bark();
}
组合
-
组合表示一个类包含另一个类的对象,即“有一个(has-a)”的关系。
例如:汽车有发动机 →Car
包含Engine
。 -
黑箱复用:通过接口交互,无需了解内部实现。
-
低耦合:被组合类的修改不会直接影响组合类。
class Engine {
public:void start() { cout << "引擎启动!" << endl; }
};class Car {
private:Engine engine; // Car has-a Engine
public:void drive() {engine.start();cout << "汽车行驶中..." << endl;}
};int main() {Car car;car.drive();
}
相关文章:

万文c++继承
1、继承的概念与定义 1.1继承的概念 继承:是c代码复用的手段,允许在原有的基础上扩展,在此之前都是函数层次的复用,继承是类设计层次的复用。 下面有两个类Student和Teacher都有姓名/地址/电话/年龄等成员变量。都有identity身…...
HTTP GET报文解读
考虑当浏览器发送一个HTTP GET报文时,通过Wireshark 俘获到下列ASCII字符串: GET /cs453/index.html HTTP/1.1 Host: gaia.cs.umass.edu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) Acc…...

Linux grep -r 查找依赖包是否存在依赖类 Class
方法一:通过 Linux ,grep -r ClassPath 命令 grep -f org.apache.kafka.connect.source.SourceRecord在 jar 包所在 lib 或者 lib/plugins 目录下执行,grep -r, flink-sql-connector-sqlserver-cdc-3.3.0.jar 中此 kafka Source…...

41:像素坐标与实际坐标转化
采用上面的算子 将像素坐标点转换为实际坐标 image_points_to_world_plane(CamParam, Worldpose, Row, Column, m, X, Y) 第一个参数:标定得到的内参--根据标定助手得到的 第二个参数:标定得到的外参--根据标定助手得到的 第三个参数:计算…...

大某麦演唱会门票如何自动抢
引言 仅供学习研究,欢迎交流 抢票难,难于上青天!无论是演唱会、话剧还是体育赛事,大麦网的票总是秒光。大麦网是国内知名的票务平台,热门演出票往往一票难求。手动抢票不仅耗时,还容易错过机会。作为一名…...
人工智能外呼系统:重构智能交互的全维度进化
在数字化浪潮席卷全球的今天,人工智能外呼系统正以其颠覆性的技术革新,重新定义企业与客户的沟通范式。这一融合语音识别、自然语言处理与机器学习的智能系统,不仅实现了从 “机械应答” 到 “智慧交互” 的跨越,更在金融、医疗、…...

LVS负载均衡群集和keepalive
目录 一. 集群概述 1.1 集群的定义 1.2 集群的分类 1. 高可用集群 HA 2. 高性能运输群集 HPC 3.负载均衡群集 LB 4. 分布式存储集群 二. LVS概述 2.1 LVS的定义 2.2 LVS的工作原理 2.3 LVS 的三种工作模式 2.4 LVS 三种工作模式的对比 2.5 LVS 调度算法 1. 静态…...
在 Excel 中有效筛选重复元素
如果是新版excel UNIQUE(FILTER(D2:D19, COUNTIF(D2:D19, D2:D19)>1)) 旧版 Excel(如 2019/2016/2013) 使用方法:在 E2 单元格输入此公式。按 Ctrl Shift Enter(数组公式)。向下拖动填充至空白行为止。 IFERROR…...

Apache Pulsar 消息、流、存储的融合
Apache Pulsar 消息、流、存储的融合 消息队列在大层面有两种不同类型的应用,一种是在线系统的message queue,一种是流计算,data pipeline的streaming高throughout,一致性较低,延迟较差的过程。 存算分离 扩容和缩容快…...

最优化方法Python计算:有约束优化应用——线性可分问题支持向量机
设问题的数据样本点 ( x i , y i ) (\boldsymbol{x}_i,y_i) (xi,yi), x i ∈ R n \boldsymbol{x}_i\in\text{R}^n xi∈Rn, y i 1 y_i\pm1 yi1, i 1 , 2 , ⋯ , m i1,2,\cdots,m i1,2,⋯,m。由于标签数据 y i ∈ { − 1 , 1 } y_i\…...
Linux 离线安装 Docker 和 Docker Compose 最新版 的完整指南
一、准备工作 1. 下载安装包(需在有网络的机器操作): Docker 引擎:从官方仓库下载最新二进制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgzDocker Compose:下载最新二进制…...

SpringBoot学习(上) , SpringBoot项目的创建(IDEA2024版本)
目录 1. SpringBoot介绍 SpringBoot特点 2. SpringBoot入门 2.1 创建SpringBoot项目 Spring Initialize 第一步: 选择创建项目 第二步: 选择起步依赖 第三步: 查看启动类 2.2 springboot父项目 2.3 测试案例 2.3.1 数据库 2.3.2 生成代码 1. SpringBoot介绍 Spring B…...
数据结构(四)——栈的应用—数制转换
利用栈进行数制转换: 十进制转换八进制:先将十进制数除以八得到余数,余数入栈,然后将得到的商继续除以八,直到商为零 #include <stdio.h> #include <stdlib.h>#define MAXSIZE 100//数制转换//定义链表节…...
多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现
一.创建自己的PlayerController。它相当于是灵魂,穿梭在不同Pawn之间。也即是切换视角。不同输入的响应也写在这里。这样即使,都有鼠标操作,也能区分。避免了代码的重复耦合。也可以叫做视角系统。 class LZJGAMEMODE_API ALZJPlayerControl…...

【Redis 进阶】哨兵模式
思维导图: 一、哨兵模式概述 (一)传统主从复制模式的局限性 在传统的Redis主从复制架构中,若主节点发生故障,运维人员需手动执行故障转移操作,将一个从节点提升为新主节点,并逐一通知所有客户…...
掌控随心 - 服务网格的流量管理艺术 (Istio 实例)
掌控随心 - 服务网格的流量管理艺术 (Istio 实例) 想象一下,没有服务网格的时候,我们要实现像“将 1% 的用户流量导入到新版本应用”、“根据用户设备类型访问不同后端”、“模拟下游服务故障”这类高级流量策略,通常需要在代码、负载均衡器、API 网关等多个地方进行复杂且分…...
在服务器排查java某个线程导致CPU飙高教程
🧩 第一步:确定是哪个线程占用 CPU 高 1.1 使用 top 或 htop 命令查看高 CPU 的 Java 进程 top -Hp <Java进程PID>-H 表示显示线程级别;-p 后面跟 Java 主进程的 PID;你会看到各个线程的 CPU 使用情况,找出使用…...
电子商城后台管理平台-Flask Vue项目开发
电子商城后台管理系统 电子商城后台管理平台-Flask 项目开发 文章目录 前言网课内容数据库参数用户模块/user/前端LESS 的语法使用LESS 的特点 ui登录页面主页页面头部左边aside 菜单main主体后端main页面设置用户-角色-权限商品分类商品信息图片保存到项目里面订单数据展示 网…...
Lettuce 节点刷新、连接优化与 Spring 升级适配全解析:从环境约束到生产验证
引言 在分布式系统中,Redis 作为高性能缓存中间件被广泛使用。随着 Spring 生态的迭代(尤其是 Spring Boot 2.0 的普及),Lettuce 逐渐取代 Jedis 成为 Redis 客户端的 “默认选择”。但开发者常面临三个核心问题:Let…...

CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开
苹果公司近日针对macOS系统中新披露的CVE-2025-31258漏洞发布补丁,该漏洞可能允许恶意应用程序突破沙箱限制,获取未授权的系统资源访问权限。在安全研究员Seo Hyun-gyu公开概念验证(PoC)利用代码后,该漏洞已在macOS Se…...
UDP协议详细讲解及C++代码实例
目录 一、UDP协议概述二、UDP通信流程1)数据传输2)无连接 三、关键点解析1) 套接字创建2)无连接特性3)数据传输 四、总结 UDP协议详细讲解及C代码实例 一、UDP协议概述 UDP(User Datagram Protocol,用户数据报协议&a…...

武汉大学无人机视角下的多目标指代理解新基准!RefDrone:无人机场景指代表达理解数据集
作者:Zhichao Sun, Yepeng Liu, Huachao Zhu, Yuliang Gu, Yuda Zou, Zelong Liu, Gui-Song Xia, Bo Du, Yongchao Xu 单位:武汉大学计算机学院 论文标题:RefDrone: A Challenging Benchmark for Drone Scene Referring Expression Compreh…...

【递归、搜索和回溯】二叉树中的深搜
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1 2331. 计算布尔二叉树的值1.1 分析1.2 代码 2 129. 求根节点到叶节点数字之和2.1 分析2.2 代码 3 814. 二叉树剪枝3.1 分析3.2 代码 4 98. 验证…...

Algolia - Docsearch的申请配置安装【以踩坑解决版】
👨🎓博主简介 🏅CSDN博客专家 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入!…...

Linux513 rsync本地传输 跨设备传输 一
ping节点bPing通 仅主机模式不需要设置网关节点a也可以Ping通节点b 同步成功 下载文件夹成功 今日源码 节点a 节点b...

leetcode 383. Ransom Note
题目描述 代码 class Solution { public:bool canConstruct(string ransomNote, string magazine) {vector<int> table(26,0);for(char ch : magazine){table[ch-a];}for(char ch : ransomNote){table[ch-a]--;if(table[ch-a] < 0)return false;}return true;} };...

Skyvern:用 AI+视觉驱动浏览器自动化
Skyvern:用 AI视觉驱动浏览器自动化 一、前言二、项目概览2.1 Skyvern 项目简介2.2 代码结构与模块划分 三、环境搭建与快速上手3.1 环境准备3.1.1 系统与依赖3.1.2 克隆项目3.1.3 安装 Python 依赖3.1.4 配置环境变量3.1.5 启动服务 3.2 验证安装 四、核心功能与实…...

数据库原理期末考试速成--最后附带两套题
引言 为什么从3开始呢,毕竟是速成吗,总要放弃一些东西 前两章1.概论 2.关系数据库:这里面都是一些运算符什么的,我感觉都学这个:笛卡尔积之列的都会算 这两章比较重要的我就放在这里了 选择、投影、连接、除、并、交、差,其中选择、投影、并、差、笛卡尔积是5种基本关…...
《探索React Native社交应用中WebRTC实现低延迟音视频通话的奥秘》
WebRTC,全称为Web Real-Time Communication,是一项开创性的开源技术,为Web和移动应用开启了实时通信的大门。它打破了传统通信的束缚,使得应用之间无需依赖繁琐的中间服务器,就能实现直接的点对点通信,这是…...
关于vue 本地代理
接口调用:其中我们可以约定一个拦截的标识, 用来给本地 http://localhost/ 进行代理要请求的测试地址https:abc.com 例子: axios.post(/OwnRateReport/-------------------------------------------------------00001)devServer: {proxy: {/…...