C++继承(最详细)
目录
1.继承的概念以及定义
1.1 继承的概念
1.2 继承的定义
编辑
2.继承中的作用域
3.基类和派生类间的转换
4.派生类的默认成员函数
5.实现不被继承的类
6.継承与友元
编辑
7.继承与静态成员
8.多继承及其菱形继承问题
8.2 虚继承
8.3 来看一个小题
9.继承和组合
学完STL后,咱们再转回来看语法,今天要讲的语法是继承,这也是一个算是比较难的语法,做好了?发车喽,来跟博主一起学习吧!
1.继承的概念以及定义
1.1 继承的概念
什么叫继承呢?继承算是属于对代码的复用。即在保持原有的特性上面,增加一些新的方法以及变量,就叫做继承。那么原有的类叫做基类(父类),增加新的方法以及变量之后的类叫做派生类(子类)。继承 呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的 复用,继承是类设计层次的复用。
来看这一段代码,那么观察可以发现,Student与Teacher这两个类都是属于派生类(因为它们都继承了基类Person的特性),而Person类属于基类。并且,派生类定义的对象也可以调用基类中的成员函数(这个待会讲)。OK,接下来看定义:
1.2 继承的定义
如上图,Person是基类,也称作父类。Student是派生类,也称作子类。
那么到这就会有人问了:限定符有三种,那么继承方式是不是也有三种?没错,很聪明,确实有三种。
那么访问限定符加上继承方式一组合,是不是有9种组合方式呀。
当然,这里,基类的private成员,基本都是不可见的,(是不可见,不是没继承下来,别搞错了)。那么继承方式怎么看呢?
1.基类的其他成员 在派生类的访问方式==Min(成员在基类的访问限定符,继承方式),public >protected>private。
所以通过这个,咱们之前设计一个类,都是不知道啥设计成public,啥设计成protected,现在可能有点眉目了。
2.基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类 中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
但这里涉及到一个问题,既然private,都不能访问,那我要它做什么?或者说我要private継承有什么用吗?所以说,在这,真正用到的也就两个,即public继承下的两个(基类public成员与基类protected成员)。
3.在实际运用中⼀般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用 protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实 际中扩展维护性不强。
4.使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显 示的写出继承方式。
2.继承中的作用域
隐藏规则:
1. 在继承体系中基类和派生类都有独立的作用域。
2. 派生类和基类中有同名成员,派生类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏。 (在派生类成员函数中,可以使用基类::基类成员显示访问)
3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
4. 注意在实际中在继承体系里面最好不要定义同名的成员。
看上面的代码图片,可以看出,如果只定义派生类的对象,用派生类的对象调用_num,那么默认调用的是派生类中的_num(就近原则)。若是想调用基类中的_num,必须得在调用的那个函数里指定作用域。还有一些注意事项,都在上面的代码图片中。反正如果说基类与派生类中有同名的成员函数或者成员变量,优先调用派生类中的(就近原则)。
在这里需要强调一个东西就是:重载:重载是函数名相同,参数类型或者参数个数不同,并且构成重载的函数必须在同一个作用域中。比如:基类跟派生类是两个不同的作用域,所以不构成重载。
隐藏:函数名相同并且作用域不在同一个作用域就构成了隐藏。
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;
}
那么看上面的代码,A类与B类中的fun()函数构成了隐藏(注意不是重载)。并且这个程序执行不了,因为虽然第一个函数可以调用,调用了派生类中的fun函数,但是第二个函数在派生类中找不到,那么找不到就无法调用,程序就无法运行。
3.基类和派生类间的转换
1.public继承的派生类对象可以赋值给基类的指针/基类的引用。这里有个形象的说法叫切片或者切 割。寓意把派生类中基类那部分切出来,基类指针或引用指向的是派生类中切出来的基类那部分。
2.基类对象不能赋值给派生类对象。
3.基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针 是指向派生类对象时才是安全的。
废话少说,上代码:
class Person
{
protected :
string _name; // 姓名
string _sex; // 性别
int _age; // 年龄
};
class Student : public Person
{
public :
int _No ; // 学号
};
int main()
{
Student sobj ; // 1. 派生类对象可以赋值给基类的指针 / 引用
Person* pp = &sobj;
Person& rp = sobj;
// 派生类对象可以赋值给基类的对象是通过调用后面会讲解的基类的拷贝构造完成的
Person pobj = sobj;
//2. 基类对象不能赋值给派生类对象,这里会编译报错
sobj = pobj;
return 0;
}
这个切片的作用就是将派生类中属于基类的那一部分给切出来,怎么切呢,就通过上面所说的方法即可。 这个切片后面代码有作用,再带大家来进一步的理解。
4.派生类的默认成员函数
这个默认成员函数,还是类的那六个,因为派生类也属于类嘛。
先来看一段代码吧:
class Person
{
public:
Person(const char*name="peter",const char *telephone="1234")
: _name(name)
,_telephone(telephone)
{
cout << "Person()" << endl;
}Person(const Person& p)
: _name(p._name)
,_telephone(p._telephone)
{
cout << "Person(const Person& p)" << endl;
}Person& operator=(const Person& p)
{
cout << "Person operator=(const Person& p)" << endl;
if (this != &p)
_name = p._name;
_telephone = p._telephone;return *this;
}~Person()
{
cout << "~Person()" << endl;
}
protected:
string _name="kate"; // 姓名//有初始化列表先走初始化列表,无初始化列表就用
//缺省值,反正,最后都类似的要走初始化列表,并且,若派生类中有对基类的初始化
//还必须得看派生类中的。
string _telephone="0000";
};
class Student : public Person
{
public:
Student(const char* name, const char* telephone, int num)
: Person(name,telephone)//如将基类中的初始化列表屏蔽了再去执行这个
//会发现执行不通,是因为这个就是得调用基类的初始化列表,但是基类的初始化
//列表被咱屏蔽了呀。那肯定会报错的
,_num(num)
{
cout << "Student()" << endl;
}Student(const Student& s)
: Person(s)//这个地方要把派生类中的基类那一部分给拿出来
//那么切片,就是将派生类对象赋值给基类的引用或指针,叫切片
//并且这里只需要这么写person(s)。因为上面的基类中是&p,
//所以说意思就是将派生类中的基类的那一部分给切下来给基类,交给他们进行
//初始化即可。当然,若基类中只有一个成员变量,可能你说有点多余,但是基类中
//有好多个成员变量呢?直接把他们切下来就非常好用了。
, _num(s._num)
{
cout << "Student(const Student& s)" << endl;
}Student& operator = (const Student& s)
{
cout << "Student& operator= (const Student& s)" << endl;
if (this != &s)
{
// 构成隐藏,所以需要显⽰调⽤
Person::operator =(s);
_num = s._num;
}
return *this;
}~Student()
{
cout << "~Student()" << endl;
}
protected:
int _num; //学号};
int main()
{
Student s1("jack","23456", 18);
Student s2(s1);
Student s3("rose","56789" ,17);
s1 = s3;//按理说派生类的拷贝构造与析构都是不需要自己去写的,只有一个构造需要自己写
//一般写一个类后,最好还是自己实现一下构造函数,即初始化
//若其默认构造函数的行为不符合需求(例如需要特定参数),需显式调用其他构造函数
//但一般默认构造函数也就会将它们初始化为空(string)
//接下来,我需要确认std::vector的默认构造函数的定义。根据C++标准,
// 默认构造函数会创建一个空的vector,没有元素,容量为0。
// 这意味着它不会分配任何内存,只是初始化内部指针为nullptr,大小和容量为0。
//cplusplus网站上的构造的第一个就是默认构造函数的行为
return 0;
}
1.关于构造函数部分:由于派生类中有基类的那一部分,子类继承父类,创建一个子类对象的时候,这个子类对象中有父类的部分的,是需要调用父类的构造来构造这部分内容的。所以说要先调用基类的构造函数,先完成对基类的构造,之后再构造派生类。
2.派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
3.派生类的operator=必须要调用基类的operator=完成基类的复制。需要注意的是派生类的 operator=隐藏了基类的operator=,所以显示调用基类的operator=,需要指定基类作用域。
4.来看它的析构函数:
这是上面那个代码的执行结果,观察这个我们发现,有三个一样的~student(),~person(),这个是因为有三个对象,需要析构三次。关键的问题是不是只析构一次吗?为什么会出现两个内容?(~student()与~person())原因是:
这里先调用了派生类的析构函数,之后调用了基类的析构函数,那么为什么先调用派生类的析构函数呢?因为,派生类是依靠基类来实现的吧,所以说,如果先析构了基类,那么依靠基类的派生类中的资源是不是就是不安全的了(因为基类都被析构了),所以为了确保派生类的安全,就先析构派生类,这样可以避免资源安全的问题。
还有一个问题就是,我能不能在这里显示的写一个基类的析构函数,不可以的,原因是,你只要显示写了,大概率会先调用基类的析构函数,那么经过咱们上面的解释,是不是先调用基类的析构函数不安全。并且,子类的析构函数是比较特殊的一个函数,我们不需要显示调用父类析构函数,每个子类析构函数后面,会自动调用父类析构函数。所以说析构函数不需要咱们去管就行了。
还有一个问题:基类的析构函数要与派生类的析构函数名字保持一致。因为多态中⼀些场景析构函数需要构成重写,重写的条件之⼀是函数名相同(这个多态章节会讲 解)。那么编译器会对析构函数名进行特殊处理,处理成destructor(),所以基类析构函数不加 virtual的情况下,派生类析构函数和基类析构函数构成隐藏关系。
5.实现不被继承的类
这里咱们讲C++11的用法,因为C++11的用法较C++98更简单。
在基类后面加上final关键字,那么这个基类就不可以被继承了。
6.継承与友元
基类的友元是不可以被继承到派生类中的(就像父亲的朋友不是你的朋友)
这里有两个问题:
1.基类中的友元声明,并不知道student类在哪。那有同学又说了要是把派生类放基类前面不就可以了吗?那请问你这样的话,这个継承还怎么继承呢?所以最好的办法就是在开头加上class student,让编译器知道有这个类。
2.如果不在student类中加上友元声明,那么下面的友元函数中的第二个就无法打印,因为类外无法访问类中的protected限定的成员变量,除非也在student类中加上友元声明 。
7.继承与静态成员
基类定义了static静态成员,则整个继承体系里面只有⼀个这样的成员。无论派生出多少个派生类,都 只有⼀个static成员实例。
8.多继承及其菱形继承问题
单继承:⼀个派生类只有⼀个直接基类时称这个继承关系为单继承
多继承:⼀个派生类有两个或以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型 是,先继承的基类在前⾯,后⾯继承的基类在后⾯,派生类成员在放到最后⾯。
菱形继承:菱形继承是多继承的⼀种特殊情况。菱形继承的问题,从下⾯的对象成员模型构造,可以 看出菱形继承有数据冗余和二义性的问题,在Assistant的对象中Person成员会有两份。支持多继承就 ⼀定会有菱形继承,像Java就直接不支持多继承,规避掉了这里的问题,所以实践中我们也是不建议 设计出菱形继承这样的模型的。
这种就是菱形继承问题,那么就会导致Assistant中有两个person中的成员变量,会冗余。并且,你要是调用比如student类继承的person变量,不可以,因为编译器不知道你要调用哪个(因为teacher中,person中都有这个成员变量)。
其实这种也是菱形继承:B继承了A,C继承了B,D继承了A,E继承了C和D,那么E就有了两份A
只要派生类中有两份相同的变量时,都叫做菱形继承,那么在B和D的位置放virtual,原因下面有。
解决办法就是:
1.指定作用域是哪个类。
2.采用虚继承的方式。
8.2 虚继承
在继承那个双份的成员变量的第一个派生类中加上virtual即可。virtual加在:后,继承方式前。
那么加上这个后,你再去访问那个双份的成员变量,访问到的就只有最一开始的基类中的成员变量。要是还想访问类中的那个成员变量,加上作用域即可。
8.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;
}
看这个题,main函数里的看着熟悉不,没错,就是咱们说的切片,那么这个问题的本质就是,这个切片在内存中是怎么存储的,就是先先继承的内存更靠上 。
p3是指向派生类的指针,自然指向最上面,地址的起始处。而p1是最先继承的,所以也在地址最高处,而p3与p1指向同一个地方,纯属巧合。自然p2的位置就相对于靠后点。
所以说它们几个的关系是: p3==p1!=p2
9.继承和组合
1.public继承是⼀种is-a的关系。也就是说每个派生类对象都是⼀个基类对象。
2.组合是⼀种has-a的关系。假设B组合了A,每个B对象中都有⼀个A对象。
3.继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复⽤ (white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对派生类可 见。继承⼀定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依 赖关系很强,耦合度高。
4.对象组合是类继承之外的另⼀种复⽤选择。新的更复杂的功能可以通过组装或组合对象来获得。对 象组合要求被组合的对象具有良好定义的接口。这种复⽤风格被称为黑箱复用(black-boxreuse), 因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。组合类之间没有很强的依赖关 系,耦合度低。优先使用对象组合有助于你保持每个类被封装。
5.优先使用组合,而不是继承。实际尽量多去用组合,组合的耦合度低,代码维护性好。不过也不太 那么绝对,类之间的关系就适合继承(is-a)那就⽤继承,另外要实现多态,也必须要继承。类之间的 关系既适合用继承(is-a)也适合组合(has-a),就用组合。
继承的写法
template<class T>
class stack :public vector<T>
{};
组合的写法
template<class T>
class stack
{
public:
vector<T> _v;
};
这里有个耦合度的概念:可以把耦合度理解为联系,耦合度高就是联系紧密,耦合度低就是联系松散。那么咱们写一个项目,有几百个类,那么使用耦合度低的,还是耦合度高的?肯定是耦合度低的,你想想,如果说,你在写项目的时候,一个类写错了,那么入过这个项目的耦合度高,会牵连到其他的几个类,甚至说整个项目,导致整个项目会出现修不完的bug,严重的时候,可能要重写。这个代价成本可是非常大的。所以说有耦合度低的肯定都会选择耦合度低的。
而上文提到的白箱与黑箱,就是白箱就是可视化程度很高,即 继承,因为继承的话,基类中的所有派生类都可以看到,也就是耦合度高。而黑箱,就是可视化很低,也就说明每个类之间耦合度低,所以说,没有啥联系,互相之间可看到的代码也就很少,符合类的封装。
OK,可算是讲完了,大家若是发现错误,还请指出,谢谢啦!
本篇完.........................
相关文章:
C++继承(最详细)
目录 1.继承的概念以及定义 1.1 继承的概念 1.2 继承的定义 编辑 2.继承中的作用域 3.基类和派生类间的转换 4.派生类的默认成员函数 5.实现不被继承的类 6.継承与友元 编辑 7.继承与静态成员 8.多继承及其菱形继承问题 8.2 虚继承 8.3 来看一个小题 9.继承…...
【使用Plink检测ROH问题查找】为什么检测ROH参数不一样,FROH近交系数结果差异很大?
为什么检测ROH参数不一样,结果差异很大? 结果 基于ROH检测的结果与参数设置密切相关。参数的改变(对应近交系数改变)可能会对结果产生很大影响。 原因 ROH分析缺乏共识标准,这种缺乏共识将导致结果偏倚,…...
mybatis mapper.xml中使用枚举
重点:application.propertis配置类 #TypeEnumHandler 这个类的包名,不是全路径 mybatis.type-handlers-packagecom.fan.test.handler两个枚举类: public enum StatusEnum {DELETED(0),ACTIVE(1);private final int code;StatusEnum(int cod…...
探索科技的边界:代理IP与汽车产业链的创新之旅
目录 一、代理IP:汽车产业的"数字放大镜" 二、创新应用场景:从实验室到量产线 三、技术挑战与进化方向 四、未来图景:车联网时代的"数字血管" 结语:重构产业认知的"数字齿轮" 在数字化浪潮席卷…...
单个或批量实现-提取PDF文档中的合同号和姓名并按“合同号_姓名”格式重命名文件。
第一、单个PDF文件命名格式: 提取PDF文档中的合同号和姓名并按“合同号_姓名”格式重命名文件 import pdfplumber import re import osdef extract_contract_info(pdf_path):with pdfplumber.open(pdf_path) as pdf:for page in pdf.pages:text page.extract_tex…...
虚拟机的网络配置
第一章 配置网络(注意NAT类型) 1. 在VMware中配置 虚拟网络编译器 1) 点击编辑 就会出现 虚拟网络编译器 并点击(要再虚拟机关机的情况下进行) 2)点击右下角的 更改设置 再点击 VMnet 红色框里192.168.x…...
JAVA设计模式——(二)组合模式
JAVA设计模式——(二)组合模式 原理解释实现定义规范接口定义主干定义分支定义叶子测试代码 优势 原理 组合模式用于描述对象在“整体-部分”中的关系,用户对单个对象和组合对象的使用具有一致性。 组合模式中由于单个对象和组合对象的使用…...
【数据结构和算法】5. 堆栈和队列
本文根据 数据结构和算法入门 视频记录 文章目录 1. 堆栈(Stack)1.1 概念1.2 数组栈实现1.3 链式栈实现 2. 队列(Queue)2.1 概念2.2 数组队列实现2.3 链式队列实现 在这一章我们来了解两个很特殊的数据结构:堆栈 (Stac…...
万字长文 | Apache SeaTunnel 分离集群模式部署 K8s 集群实践
文章作者:雷宝鑫 整理排版:白鲸开源 曾辉 Apache SeaTunnel官网链接: https://seatunnel.apache.org/ Apache SeaTunnel(以下简称SeaTunnel)是一款新一代高性能、分布式的数据集成同步工具,正受到业界广泛关注和应用。SeaTunnel支…...
逻辑回归:使用 S 型函数进行概率预测
逻辑回归:使用 S 型函数进行概率预测 摘要 本文章深入探讨了逻辑回归模型如何利用 S 型函数将线性回归的输出转换为概率值。文章详细阐述了 S 型函数的数学原理、在逻辑回归中的应用以及其在机器学习中的重要性。通过具体示例和练习,帮助读者理解如何使…...
马浩棋:产通链CT-Chain 破局不动产 RWA,引领数智金融新变革
全球不动产 RWA 数智金融高峰论坛上马浩棋先生致辞 在全球不动产 RWA 数智金融高峰论坛暨产通链 CT-Chain 上链首发会的现场,犀牛世纪集团(香港)有限公司董事会主席马浩棋成为众人瞩目的焦点。此次盛会汇聚了全球金融、区块链及不动产领域的…...
iscsi服务端安装及配置
1. 安装targetcli软件包 yum install -y targetcli 2. 启动target服务 systemctl start target systemctl enable target 3. 配置防火墙 firewall-cmd --add-port"3260/tcp" 3. 准备一个物理分区(或者逻辑分区)…...
常见的神经网络权重文件格式及其详细说明
常见的神经网络权重文件格式及其详细说明的表格: 扩展名所属框架/工具如何生成表示内容使用方法注意事项.pt, .pthPyTorchtorch.save(model.state_dict(), "model.pt")PyTorch模型的状态字典(权重和参数)或整个模型加载方式&#…...
帕金森发病类型和阶段
文章目录 直观认识帕金森综合症的类型一、原发性帕金森综合征二、继发性(获得性)帕金森综合征三、帕金森叠加综合征(Atypical Parkinsonism)四、遗传性帕金森综合征五、其他罕见类型推荐文献与资源 PD的病理分期理论(B…...
基于ssm的“安家”儿童福利院管理系统(源码+文档)
项目简介 “安家”儿童福利院实现了以下功能: “安家”儿童福利院管理系统的主要使用者分为管理员:儿童管理、申请领养管理、捐赠管理、楼栋管理、宿舍管理、分配信息管理、宿舍物品管理、报修管理、维修工管理、报修状态管理、留言管理、系统管理。 用…...
闲聊人工智能对媒体的影响
技术总是不断地改变信息的传播方式。互联网促进了社交媒体的蓬勃发展。 网络媒体成为主流。大语言模型为代表的人工智能的出现,又会对媒体传播带来怎样的改变呢?媒体的演变反映了社会和技术的演变。 人工智能(AI) 将继续对整个媒体行业产生变革性的影响。…...
健身房管理系统(springboot+ssm+vue+mysql)含运行文档
健身房管理系统(springbootssmvuemysql)含运行文档 健身房管理系统是一个全面的解决方案,旨在帮助健身房高效管理其运营。系统提供多种功能模块,包括会员管理、员工管理、会员卡管理、教练信息管理、解聘管理、健身项目管理、指导项目管理、健身器材管理…...
离散化区间和 java c++
文章目录 题面解题思路javacpp 题面 题目链接:点击传送 假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。 现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。 接下来,进行 m 次询问,每…...
「数据可视化 D3系列」入门第十二章:树状图详解与实践
树状图深度解析与实现 一、核心API解析1. d3.hierarchy2. d3.tree3. 节点操作方法 二、完整实现解析三、高级技巧与优化四、常见问题解决小结下章预告:地图可视化 树状图是一种常见的层次结构可视化方式,它能够清晰地展示数据之间的父子关系。本文将详细…...
IDEA 创建Maven 工程(图文)
设置Maven 仓库 打开IDEA 开发工具,我的版本是2024.3.1(每个版本的位置不一样)。在【Customize】选项中,可以直接设置【语言】,在最下面选择【All setting】。 进入到熟悉的配置界面,选择配置的【setting…...
机器学习06-RNN
RNN(循环神经网络)学习笔记 一、RNN 概述 循环神经网络(Recurrent Neural Network,RNN)是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神…...
Java常用正则表达式及使用方法
在 Java 中,Pattern 和 Matcher 类是 java.util.regex 包的核心,用于处理正则表达式。 Pattern 类 Pattern 类表示编译后的正则表达式,它提供了一种将正则表达式字符串编译成可执行对象的方式,以便后续用于匹配操作。 常用方法…...
新零售行业时代:如何用科技驱动传统零售的转型升级
新零售行业时代:如何用科技驱动传统零售的转型升级 “在变化的世界中,唯一不变的是变化本身。” 一、传统零售的困局:当“生存”成为一场鏖战 街角的便利店老板老王,每天凌晨4点起床进货,却在月…...
DeepSeek和Excel结合生成动态图表
文章目录 一、前言二、3D柱状图案例2.1、pyecharts可视化官网2.2、Bar3d-Bar3d_puch_card2.3、Deepseek2.4、WPS2.5、动态调整数据 一、前言 最近在找一些比较炫酷的动态图表,用于日常汇报,于是找到了 DeepseekExcel王牌组合,其等同于动态图…...
大模型学习笔记------Llama 3模型架构之分组查询注意力(GQA)
大模型学习笔记------Llama 3模型架构之分组查询注意力(GQA) 1、分组查询注意力(GQA)的动机2、 多头注意力(Multi-Head Attention, MHA)3、 多查询注意力 (Multi-Query Attention,MQA)4、 分组查…...
WordPress 只能访问html文件,不能访问php
部署WordPress 遇到的问题 说来惭愧,尝试了多次流程,输入ip能够访问到配置路径下面的html文件,但就是无法访问php文件,查来查去,最后在AI工具的逐一梳理下,是PHP-FPM配置下面出的问题,默认账号…...
Python 之 pyecharts 使用
要说绘制动态图表,echarts 肯定是有一席之地的,特别是像 flask 这种轻量级的 web 框架,在 html 中动态嵌入生成 echarts 无疑是很优的选择。pyecharts 简单来说就是以 python 的方式来生成对应的 echarts 图表。 安装 pip install pyechart…...
【第九章 Python学习之函数Ⅱ】
【2025】Python最新最完整教程,零基础看这一个就够了 第九章 Python学习之函数Ⅱ 文章目录 【2025】Python最新最完整教程,零基础看这一个就够了前言一、说两句二、定义函数函数定义规则函数的参数参数的类型及用途1. 必需参数(位置参数)2. 关键字参数3. 默认参数4. 可变参…...
传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100。
### Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100。 这是因为集合数据量过大,需要对集合进行拆分操作࿰…...
IDEA热加载
翻译:"你运行的应用程序 BfApplication 启动之后,它的一些类文件(通常是你修改过的 .java 文件被重新编译了)发生了变化。你想现在就重新加载这些更改过的类吗?" 解释: 热重载: 这是一种开发时非常有用的技术。当你…...
常用第三方库:dio网络库使用与封装
常用第三方库:dio网络库使用与封装 前言 dio是Flutter生态中最受欢迎的网络请求库之一,它提供了强大的功能和灵活的配置选项。本文将从实战角度深入介绍dio的使用技巧和最佳实践。 基础知识 1. dio简介 dio是一个强大的Dart Http请求库,…...
解决IntelliJ IDEA配置文件(application.properties)中文注释变成乱码的问题
文章目录 1. 问题呈现2. 问题产生的原因3. 解决方法 更多 IntelliJ IDEA 的使用技巧可查看 IntelliJ IDEA 专栏中的文章:IntelliJ IDEA 1. 问题呈现 在 IntelliJ IDEA 中打开配置文件(application.properties)时,文件中的中文注…...
linux基础14--dns和web+dns
DNS:域名系统(Domain Name System) DNS协议是用来将域名转换为IP地址或将IP地址转换为相应的域名 DNS使用TCP和UDP端口53,给用户提供解析时一般使用UDP53 对于每一级域名长度的限制是63个字符,域名总长度则不能超过2…...
Java 静态内部类面试题与高质量答案合集
本文整理了关于 Java 静态内部类(Static Nested Class)在面试中的高频问题及标准答案,帮助你理解其底层原理、内存表现以及实际应用。 1. 什么是静态内部类?和普通内部类有什么区别? 答: 静态内部类是定义…...
React.cloneElement的用法详解
React.cloneElement的用法详解 React.cloneElement 是 React 提供的一个 API,用于克隆现有的 React 元素,并在克隆的基础上添加或覆盖属性,同时保留原有的子元素。 语法 React.cloneElement(element: ReactElement, props?: Partial<P…...
【数学建模】孤立森林算法:异常检测的高效利器
孤立森林算法:异常检测的高效利器 文章目录 孤立森林算法:异常检测的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步骤一:构建孤立树(iTree)步骤二:构建孤立森林(iForest)步骤三:计算异常分数 3 代码实现…...
3.1 WPF使用MaterialDesign的介绍1
MaterialDesignInXAML Toolkit 是一个流行的开源 C# WPF 控件库,它实现了 Google 的 Material Design 规范,让开发者可以轻松创建现代化的 WPF 应用程序界面 Material Design 是一个流行的设计语言,由 Google 开发,旨在帮助开发者构建美观且一致的 UI 界面。对于使用 C# 的…...
多路转接select服务器
目录 select函数原型 select服务器 select的缺点 前面介绍过多路转接就是能同时等待多个文件描述符,这篇文章介绍一下多路转接方案中的select的使用 select函数原型 #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, f…...
【算法】BFS-解决FloodFill问题
目录 FloodFill问题 图像渲染 岛屿数量 岛屿的最大面积 被围绕的区域 FloodFill问题 FloodFill就是洪水灌溉的意思,假设有下面的一块田地,负数代表是凹地,正数代表是凸地,数字的大小表示凹或者凸的程度。现在下一场大雨&…...
二叉树层序遍历技术解析与面试指南
文章目录 一、二叉树层序遍历技术解析1. 问题描述2. 层序遍历核心思想3. Java实现代码(带详细注释)4. 算法关键点解析5. 复杂度分析 二、资深后端面试深度指南1. 高频面试问题集Q1: 如何实现Z字形层序遍历(锯齿形遍历)?…...
软考软件设计师考试情况与大纲概述
文章目录 **一、考试科目与形式****二、考试大纲与核心知识点****科目1:计算机与软件工程知识****科目2:软件设计** **三、备考建议****四、参考资料** 这是一个系列文章的开篇 本文对2025年软考软件设计师考试的大纲及核心内容进行了整理,并…...
一款丰富的工作流自动化平台 | N8N 83.6K ⭐
N8N 介绍 N8N 是一个工作流自动化平台,为技术团队提供代码的灵活性和无代码的速度。n8n 具有 400 集成、原生 AI 功能和公平代码许可证,可让您构建强大的自动化功能,同时保持对数据和部署的完全控制。 🚢 项目地址 Github: https…...
Apache PDFBox
Apache PDFBox 是一个用于处理 PDF 文档的开源 Java 库,由 Apache 软件基金会开发和维护。它提供了丰富的功能,允许开发者在 Java 应用程序中创建、读取、修改和提取 PDF 文件中的信息。以下是关于 PDFBox 的详细介绍: 主要功能 创建 PDF 文…...
如何批量为多个 Word 文档添加水印保护
在日常办公中,Word文档添加水印是一项重要的操作,特别是在需要保护文件内容的安全性和版权时。虽然Office自带了添加水印的功能,但当需要一次性给多个Word文档添加水印时,手动操作显得非常繁琐且低效。为了提高效率,可…...
【MySQL】005.MySQL表的约束(上)
文章目录 表的约束1. 约束概念2. 空属性2.1 基本语法2.2 使用示例 3. 默认值3.1 基本概念3.2 使用示例 4. 列描述4.1 基本概念4.2 使用示例 5. zerofill5.1 基本功能5.2 使用示例5.3 注意事项 6. 主键6.1 基本概念6.2 使用示例 表的约束 1. 约束概念 真正约束字段的是数据类型…...
力扣刷题Day 27:环形链表(141)
1.题目描述 2.思路 创建一个结点集合,遍历链表,如果遇到已经加进集合的结点就说明链表有环。 3.代码(Python3) class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:node headnode_set set()while node…...
window上 elasticsearch v9.0 与 jmeter5.6.3版本 冲突,造成es 启动失败
[2025-04-22T11:00:22,508][ERROR][o.e.b.Elasticsearch ] [AIRUY] fatal exception while booting Elasticsearchjava.nio.file.NoSuchFileException: D:\Program Files\apache-jmeter-5.6.3\lib\logkit-2.0.jar 解决方案: 降低 es安装版本 ,选择…...
PDF转换Word深度评测 - ComPDFKit Conversion SDK V3.0
ComPDFKit PDF 转换 SDK 在V3.0 中有以下几个新功能: 使用百万级文档训练数据集对 PPYoloE AI 模型进行微调 全场景布局分析算法及下一代表格识别算法 重构数据结构、转换流程、PDF解析和输出模块 混合布局:将流式布局与固定布局相结合,以保持原始布局…...
Laravel 对接阿里云 OSS 说明文档
Laravel 对接阿里云 OSS 说明文档 一、 简介 将 Laravel 应用与阿里云对象存储服务 (OSS) 对接,可以利用 OSS 提供的高可用、高可靠、可扩展的存储能力来管理应用中的文件,例如用户上传的图片、视频、文档等。这有助于减轻应用服务器的存储压力&#x…...
嘻游电玩三端客户端部署实战:PC + Android + iOS 环境全覆盖教程
本篇文章将针对“网狐系列嘻游电玩组件”的三端客户端(PC端、安卓端、iOS端)进行详细部署实操讲解。文章将以实测部署为核心,提供资源结构说明、平台适配调整、打包配置、常见问题修复,并辅以必要的关键配置代码。 一、客户端资源…...