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

万文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.继承和友元

友元关系不能继承,也就是说基类友元不能访问派⽣类私有和保护成员
简单来说, 友元(Friend) 就像你家的“特殊访客”,他们被允许进入你家客厅,访问私有和保护成员)。但这种权限 仅限于你家客厅(当前类),不会自动传递进入你的房间(派生类)。
#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 小题

多继承中指针偏移问题?下⾯说法正确的是( )
A:p1 == p2 == p3 B:p1 < p2 < p3 C:p1 == p3 != p2 D:p1 != p2 != p3
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继承的概念 继承&#xff1a;是c代码复用的手段&#xff0c;允许在原有的基础上扩展&#xff0c;在此之前都是函数层次的复用&#xff0c;继承是类设计层次的复用。 下面有两个类Student和Teacher都有姓名/地址/电话/年龄等成员变量。都有identity身…...

记录一次git提交失败解决方案

问题显示: Push rejected: Push to origin/master was rejected 解决步骤: ‌拉取远程代码并合并‌ 先同步远程仓库的更新到本地&#xff0c;允许合并不相关历史记录&#xff1a; git pull origin master --allow-unrelated-histories 此操作会触发合并冲突解决流程&#xf…...

uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)

先看问题 解决方案 在HBuilderX项目中&#xff0c;若需在Web配置中显式关闭摇树优化&#xff08;Tree Shaking&#xff09;&#xff0c;可以通过以下步骤实现&#xff1a;首先&#xff0c;在配置中打开摇树优化&#xff0c;然后再将其关闭。这样操作后&#xff0c;配置文件中会…...

数字住建:助推智慧工地创新发展

近年来&#xff0c;国家和地方政府陆续出台了一系列政策措施&#xff0c;推动建筑业的智能化高质量发展。通过明确智慧工地的发展方向和目标定位&#xff0c;鼓励建筑业企业采用先进的信息化技术和管理模式&#xff0c;开展智能建造试点城市、资金扶持、税收优惠、智慧工地建设…...

libmemcached库api接口讲解二

我们来学一下怎么存数据 &#x1f4d8; libmemcached 数据写入函数详解&#xff08;set / add / replace&#xff09; ✅ 一、三个函数的作用与区别 函数作用key 存在时key 不存在时常见用途memcached_set()写入&#xff08;新增或覆盖&#xff09;✅ 覆盖✅ 创建默认推荐memc…...

【数据分析】从TCGA下载所有癌症的多组学数据

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包组学数据类型下载函数运行并行运行使用建议总结系统信息介绍 TCGA(The Cancer Genome Atlas)是一个庞大的癌症基因组数据库,包含多种癌症类型的多组学数据,如基因表达、…...

K8S redis 部署

在Kubernetes 1.26.14中部署Redis单实例/集群的步骤如下&#xff08;结合NFS持久化存储与认证配置&#xff09;&#xff1a; 一、部署Redis单实例&#xff08;StatefulSet模式&#xff09; 1. 创建配置文件 redis-statefulset.yaml # ConfigMap存储Redis配置 apiVersion: v1 …...

Android学习总结之kotlin篇(二)

扩展函数转成字节码的原理&#xff08;源码级别&#xff09; Kotlin 扩展函数在编译时会被转换为静态方法&#xff0c;这一过程涉及到以下几个关键步骤&#xff1a; 首先&#xff0c;Kotlin 编译器会为包含扩展函数的包生成一个特定的类。这个类的命名通常是基于包名和文件名的…...

QMK RGB矩阵灯效配置详解:从理论到实践(实操部分)

QMK RGB矩阵灯效配置详解:从理论到实践 引言 RGB灯效是现代机械键盘中一个非常吸引人的特性,通过QMK固件,我们可以实现丰富多彩的灯光效果。本文将详细讲解如何在QMK中配置RGB矩阵灯效,从基础理论到实际实现,帮助键盘爱好者打造专属的RGB键盘。无论你是刚开始接触QMK,还…...

知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑

1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法&#xff0c;搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命&#xff1a;在电商场景中&#xff0c;传统的「关键词匹配」已无法满足个性化购物需求&#xff0c;MOE搜索等新一代架构开始融合知识图谱…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-强化学习算法

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-强化学习算法 现在我们的核心问题是有一些同学会知道要才能强化学习。为什么才能强化学习&#xff1f;是实现AGI。例如从这个其实你从第一阶段开始以后&#xff0c;就是chatbot&#xff0c;这…...

嵌入式学习笔记 - SystemCoreClock/1000000

SystemClock 顾名思义就是系统时钟&#xff0c;位于时钟树如下中间位置&#xff0c;是PLL倍频后的部分&#xff0c;它不同于HCLK(SystemCoreClock), SystemCoreClock为系统内核时钟&#xff0c;也就是HCLK始终&#xff0c;也就是总线时钟&#xff0c;就是芯片内核运行的最终时…...

密西根大学新作——LightEMMA:自动驾驶中轻量级端到端多模态模型

导读 目前将自动驾驶与视觉语言模型&#xff08;VLMs&#xff09;结合的研究越来越火热&#xff0c;VLMs已经证明了其对自动驾驶的重要作用。本文引入了一种用于自动驾驶的轻量级端到端多模态模型LightEMMA&#xff0c;它能够集成和评估当前的商业和开源模型&#xff0c;以研究…...

MobiPDF:安卓设备上的专业PDF阅读与编辑工具

MobiPDF是一款专为安卓设备设计的PDF阅读和编辑工具&#xff0c;提供了丰富的功能&#xff0c;帮助用户在移动设备上轻松打开、阅读、批注和编辑PDF文件。无论是学生、专业人士还是普通用户&#xff0c;MobiPDF都能满足他们在移动设备上处理PDF文件的需求&#xff0c;提升工作效…...

印度尼西亚数据源对接技术指南

一、数据源全景概述 印度尼西亚作为东南亚最大经济体&#xff0c;其数据生态覆盖金融、产业、人口等多个维度。StockTV提供全链路印尼数据解决方案&#xff0c;涵盖以下核心领域&#xff1a; 数据类型覆盖范围更新频率典型应用场景金融市场数据IDX交易所股票/债券/衍生品实时…...

Apache Pulsar 消息、流、存储的融合

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

从零实现一个高并发内存池 - 2

上一篇https://blog.csdn.net/Small_entreprene/article/details/147904650?fromshareblogdetail&sharetypeblogdetail&sharerId147904650&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 高并发内存池 - thread cache 一、基本结构与原…...

promise

handleFileChange(event) {var that this;// 处理文件上传并传递回调函数this.$commonJS.handleFileUpload(event, function (tables) {console.log(tables at line 786:, tables);// 使用 Promise.all 等待所有表格解析完成Promise.all(tables.map((table) > {return new …...

Django + Celery 打造企业级大模型异步任务管理平台 —— 从需求到完整实践(含全模板源码)

如需完整工程文件(含所有模板),可回复获取详细模板代码。 面向人群:自动化测试工程师、企业中后台开发人员、希望提升效率的 AI 业务从业者 核心收获:掌握 Django 三表关系设计、Celery 异步任务实践、基础 Web 交互与前后端分离思路,源码可直接落地,方便二次扩展 一、系…...

从零开始完成“大模型在牙科诊所青少年拉新系统中RAG与ReACT功能实现”的路线图

项目核心目标&#xff1a; 构建一个智能系统&#xff0c;利用大型语言模型&#xff08;LLM&#xff09;、检索增强生成&#xff08;RAG&#xff09;和推理与行动&#xff08;ReACT&#xff09;技术&#xff0c;通过七个专门的知识向量库&#xff0c;为牙科诊所精准吸引青少年客…...

c# 倒序方法

在C#中&#xff0c;有几种方法可以对List进行倒序排列&#xff1a; 1. 使用List的Reverse()方法&#xff08;原地反转&#xff09; List<int> numbers new List<int> { 1, 2, 3, 4, 5 };numbers.Reverse(); // 直接修改原列表// 结果&#xff1a;5, 4, 3, 2, 1 …...

【!!!!终极 Java 中间件实战课:从 0 到 1 构建亿级流量电商系统全链路解决方案!!!!保姆级教程---超细】

终极 Java 中间件实战课&#xff1a;电商系统架构实战教程 电商系统架构实战教程1. 系统架构设计1.1 系统模块划分1.2 技术选型 2. 环境搭建2.1 开发环境准备2.2 基础设施部署 3. 用户服务开发3.1 创建Maven项目3.2 创建用户服务模块3.3 配置文件3.4 实体类与数据库设计3.5 DAO…...

HarmonyOs开发之———使用HTTP访问网络资源

谢谢关注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介绍HarmonyOs开发之———Video组件的使用:HarmonyOs开发之———Video组件的使用_华为 video标签查看-CSDN博客 HarmonyOS 网络开发入门&#xff1a;使用 HTTP 访问网络资源 HarmonyOS 作为新一代智能终端…...

Java Queue 接口实现

Date: 2025.05.14 20:46:38 author: lijianzhan Java中的Queue接口是位于java.util包中&#xff0c;它是一个用于表示队列的接口。队列是一种先进先出&#xff08;First-In-First-Out, 简称为FIFO&#xff09;的数据结构&#xff0c;其中元素被添加到队列的尾部&#xff0c;并从…...

【IDEA】注释配置

1. IDEA注释调整&#xff0c;去掉默认在第一列显示 修改为如下&#xff1a; 2. IDEA中修改代码中的注释颜色...

day25 python异常处理

目录 Python 的异常处理机制 核心概念 常见的异常处理结构 try-except try-except-else 常见异常类型 SyntaxError&#xff08;语法错误&#xff09; NameError&#xff08;名称错误&#xff09; TypeError&#xff08;类型错误&#xff09; ValueError&#xff08;值…...

【测试】BUG

目录 1、描述BUG的要素&#xff1a; 2、BUG的级别 3、BUG的状态的流转 4、与开发产⽣争执怎么办&#xff08;⾼频考题&#xff09; 什么是BUG&#xff1f;&#xff1f;&#xff1f; 程序与规格说明之间的不匹配才是错误 1、描述BUG的要素&#xff1a; 问题出现的版本、问…...

Java面向对象三大特性深度解析

Java面向对象三大特性封装继承多态深度解析 前言一、封装&#xff1a;数据隐藏与访问控制的艺术1.1 封装的本质与作用1.2 封装的实现方式1.2.1 属性私有化与方法公开化1.2.2 封装的访问修饰符 二、继承&#xff1a;代码复用与类型扩展的核心机制2.1 继承的定义与语法2.2 继承的…...

C 语言学习笔记(8)

内容提要 数组 数组的概念一维数组 数组 数组的概念 什么是数组 数组是相同类型&#xff0c;有序数据的集和 数组的特征 数组中的数据被称之为数组的元素&#xff08;所谓的元素&#xff0c;其实就是数组的每一个匿名的变量空间&#xff09;&#xff0c;是同构。数组中的…...

Screen Mirroring App:轻松实现手机与电视的无缝投屏

Screen Mirroring App 是一款由2kit consulting发行的电视投屏软件&#xff0c;专为用户提供便捷的投屏解决方案。它支持将手机和平板屏幕上的内容实时投射到大电视上&#xff0c;无论是观看影视作品、玩游戏、浏览照片还是阅读电子书&#xff0c;都能提供清晰、稳定的画质和流…...

html js 原生实现web组件、web公共组件、template模版插槽

在现代浏览器中&#xff0c;通过 class 继承 HTMLElement 可以轻松创建原生 Web Components&#xff08;自定义元素&#xff09;&#xff0c;并能享受与普通 HTML 元素同等的语义和性能优势。下面将从核心概念、生命周期方法、Shadow DOM、表单关联、自定义属性、以及与 Vue 3 …...

【爬虫】DrissionPage-2

之前的三个对象是4.0版本&#xff0c;看到的是网上大佬们网上的文章&#xff0c;因为看到官网更新了4.1&#xff0c;我觉得有必要了解一下&#xff1a;文档地址&#xff1a;&#x1f4a5; 4.1 功能介绍 | DrissionPage官网 点击链接看官网就行&#xff0c;下面一样的。 4.1 的…...

鸿蒙OSUniApp 制作个人信息编辑界面与头像上传功能#三方框架 #Uniapp

UniApp 制作个人信息编辑界面与头像上传功能 前言 最近在做一个社交类小程序时&#xff0c;遇到了需要实现用户资料编辑和头像上传的需求。这个功能看似简单&#xff0c;但要做好用户体验和兼容多端&#xff0c;还是有不少细节需要处理。经过一番摸索&#xff0c;总结出了一套…...

系统漏洞扫描服务:维护网络安全的关键与服务原理?

系统漏洞扫描服务是维护网络安全的关键措施&#xff0c;能够迅速发现系统中的潜在风险&#xff0c;有效预防可能的风险和损失。面对网络攻击手段的日益复杂化&#xff0c;这一服务的重要性日益显著。 服务原理 系统漏洞扫描服务犹如一名恪尽职守的安全守护者。它运用各类扫描…...

[原创](现代C++ Builder 12指南): 在界面开发中, 如何利用C++高级特性“折叠表达式“?.

[序言] 在现代C++编程中, 现代C++引入的折叠表达式(Fold Expressions)是一项极具价值的特性, 它为模板编程带来了更高的灵活性和简洁性. 折叠表达式允许在参数包上执行简洁的折叠操作, 从而减少冗余代码, 提升代码的可读性与维护性. 在界面开发领域, 特别是使用C++ Builder 12进…...

KUKA机器人中断编程3—暂停功能的编程

在KUKA机器人的使用过程中&#xff0c;对于调试一个项目&#xff0c;当遇到特殊情况时需要暂停机器人&#xff0c;等异常情况处理完成后再继续机器人的程序运行。wait for指令是等待一个输入信号指令&#xff0c;没有输入信号&#xff0c;机器人一直等待。在一定程度上程序也不…...

【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;LeetCode 热题 100 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 相交链表反转链表回文链表环形链表环形链表 II合并两个有序链表两数相加删除链表的倒数第 N 个结点两两交换链表中的…...

Seata源码—1.Seata分布式事务的模式简介

大纲 1.Seata分布式事务框架简介 2.Seata AT模式实现分布式事务的机制 3.Seata AT模式下的写隔离机制 4.Seata AT模式下的读隔离机制 5.官网示例说明Seata AT模式的工作机制 6.Seata TCC模式的介绍以及与AT模式区别 7.Seata Saga模式的介绍 8.单服务多个库的分布式事务…...

牛客——签到题

分析 我拿到题就去看了示例&#xff0c;可以发现&#xff0c;并非是让难度最小&#xff0c;或者难度系数出现次数最多的成为签到题的难度。那我就有点懵了。。。。。。 但仔细观察题目本身的特定条件和目标&#xff0c;即在满足选择 m 道题的前提下&#xff0c;尽可能多地选择…...

【idea】调试篇 idea调试技巧合集

前言&#xff1a;之前博主写过一篇idea技巧合集的文章&#xff0c;由于技巧过于多了&#xff0c;文章很庞大&#xff0c;所以特地将调试相关的技巧单独成章, 调试和我们日常开发是息息相关的&#xff0c;用好调试可以事半功倍 文章目录 1. idea调试异步线程2. idea调试stream流…...

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持

k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…...

直流电机风速仪

在处理直流电机风速仪的 ADC 读取问题时&#xff0c;下面为你详细介绍实现方法。 硬件连接 风速仪的输出通常是模拟信号&#xff0c;所以需要把它连接到微控制器的 ADC 输入引脚。比如&#xff0c;在 Arduino 上可以连接到 A0 - A5 这类模拟输入引脚。 ADC 读取原理 风速仪…...

dify 连接不上ollama An error occurred during credentials validation:

三大报错 An error occurred during credentials validation: HTTPConnectionPool(hosthost.docker.internal, port11434): Max retries exceeded with url: /api/chat (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f26fc3c00b0&…...

19、云端工业物联网生态组件 - 工厂能效与预测维护 - /数据与物联网组件/cloud-iiot-factory-analysis

76个工业组件库示例汇总 云端工业物联网生态组件 - 工厂能效与预测维护 (模拟) 概述 这是一个交互式的 Web 组件&#xff0c;旨在模拟一个云端工业物联网 (IIoT) 平台的核心界面&#xff0c;专注于工厂层面的能效分析和基于传感器数据的预测性维护概念。用户可以监控模拟的设…...

python打卡day25

python的异常处理机制 知识点回顾&#xff1a; 异常处理机制debug过程中的各类报错try-except机制try-except-else-finally机制 在即将进入深度学习专题学习前&#xff0c;我们最后差缺补漏&#xff0c;把一些常见且重要的知识点给他们补上&#xff0c;加深对代码和流程的理解。…...

Jmeter变量传递介绍

文章目录 一、Jmeter变量类型及作用域二、变量传递方式1. 用户定义变量&#xff08;User Defined Variables&#xff09;2. CSV 数据文件&#xff08;CSV Data Set Config&#xff09;3.正则表达式提取器4.后置处理器&#xff08;Post Processor)4.1BeanShell/JSR223 后置处理器…...

机器学习 Day16 聚类算法 ,数据降维

聚类算法 1.简介 1.1 聚类概念 无监督学习&#xff1a;聚类是一种无监督学习算法&#xff0c;不需要预先标记的训练数据 相似性分组&#xff1a;根据样本之间的相似性自动将样本归到不同类别 相似度度量&#xff1a;常用欧式距离作为相似度计算方法 1.2 聚类vs分类 聚类&…...

白日梦:一个方便快捷的将故事制作成视频的工具

我有故事&#xff0c;但我想把它制作成视频&#xff0c;有没有什么好用的工具可以使用呢&#xff1f;如果你也被类似的问题困扰&#xff0c;那么今天分享的这个工具将会解决这个问题。从需求来看&#xff0c;我们希望的是纯文本的故事输入&#xff0c;完整的故事视频输出&#…...

ultralytics中tasks.py---parse_model函数解析

一、根据scale获取对应的深度、宽度和最大通道数 具体例如yaml文件内容如下: depth=0.33,那么重复的模块例如C2f原本重复次数是3,6,6,3,那么T对应的模型重复次数就是三分之一即1,1,2,1次。这个在后面定义的: width=0.25,max_channels=1024 原本c2=64,但经过make_div…...

Codeforces Round 1003 (Div. 4)

A. Skibidus and Amog’u 题目大意 给你一个字符串&#xff0c;把末尾的us换成i 解题思路 删掉最后两个加上“i”即可 代码实现 #include <bits/stdc.h>using i64 long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int …...