20240419,继承,多态

news2025/1/13 7:33:32

 土豆的老家陕西安康!怪舒服的咯,广西一眼望去全是房子啦,小时候一眼开敞水田再也回不来啦

目录

五,继承

5.1 基本语法

5.2 继承方式

5.3 继承中的对象模型

5.4 构造和析构顺序

5.5 同名成员处理

5.6 同名静态成员处理

5.7 多继承语法

5.8 菱形继承问题及解决办法

六,多态

6.1 基本语法

6.2 原理剖析

6.3 案例-计算器类

6.4 纯虚函数和抽象类

6.5 案例-制作饮品

6.6 虚析构和纯虚析构

五,继承

5.1 基本语法

语法:class 子类(派生类):继承方式 父类(基类)
调用时只需要创建子类的对象,就可以使用父类的函数和变量

#include<iostream>
using namespace std;
class Basepage//公共页面
{
public:
	void header() {
		cout << "首页,公开课,登录,注册……(公共头部)" << endl;
	}
	void footer() {
		cout << "帮助中心,交流合作,站内地图……(公共底部)" << endl;
	}
	void left() {
		cout << "Java.,C++,Python……(公共分类列表)" << endl;
	}
};
class Java :public Basepage//继承公共的页面
{
public:
	void content() {
		cout << "Java学科视频" << endl << endl;
	}
};
class CPP :public Basepage//继承公共的页面
{
public:
	void content() {
		cout << "Cpp学科视频" << endl << endl;
	}
};
class Python :public Basepage//继承公共的页面
{
public:
	void content() {
		cout << "Python学科视频" << endl << endl;
	}
};
void test01() {
	cout << "Java下载视频页面如下" << endl;
	Java ja;
	ja.header();
	ja.footer();
	ja.left();
	ja.content();
	CPP cpp;
	cpp.header();
	cpp.footer();
	cpp.left();
	cpp.content();
	Python py;
	py.header();
	py.footer();
	py.left();
	py.content();
}
int main()
{
	test01();
	system("pause");
	return 0;
}
5.2 继承方式

父类私有权限内容均不可访问
公共继承【公共-公共,保护-保护】,保护继承【公共+保护-- 保护】,私有继承【公共+保护--私有】

#include<iostream>
using namespace std;
class Base
{
public:
	int _a;
protected:
	int _b;
private:
	int _c;
};
class son1 :public Base
{
public:
	void func() {
		_a = 10;//公共
		_b = 10;//保护
		//_c = 10;//私有
	}
};
class son2 :protected Base
{
public:
	void func() {
		_a = 99;//公共变保护
		_b = 99;//保护
		//_c = 99;
	}
};
class son3 :private Base
{
public:
	void func() {
		_a = 34;//公共变私有
		_b = 34;//保护变私有
		//_c = 34;
	}
};
class grandson3 :public son3
{
public:
	//_a = 199;son3的对象都是私有的
};
void test01() {
	son1 s1;
	s1._a = 100;
	//s1._b = 100;//保护,类外不可访问
	son2 s2;
	//s2._a = 120;//保护,类外不可访问
}
int main()
{
	test01();
	system("pause");
	return 0;
}
5.3 继承中的对象模型

父类中不可访问的对象只是隐藏了,全继承
开发人员命令提示工具——如果文件在C盘-回车,不在C盘,盘:(冒号)回车——cd (空格)——复制文件路径-回车——dir-回车——cl /d1 reportSingleClassLayout-查看的类 空格 "文件名.后缀"——回车
CL /D1 ……(首字母大写,不空格)查看的类(大小写照搬)空格 文件名(写开头两个字符,TAB键自动补上,双引号无所谓)

#include<iostream>
using namespace std;
class Base
{
public:
	int _a;
protected:
	int _b;
private:
	int _c;
};
class son1 :public Base
{
public:
	int _d;
};

void test01() {
	cout << "sizeof son1=" << sizeof(son1) << endl;//16
}
int main()
{
	test01();
	system("pause");
	return 0;
}
5.4 构造和析构顺序

BASE构造——SON1构造——SON1析构——BASE析构

#include<iostream>
using namespace std;
class Base
{
public:
	Base() {
		cout << "Base 构造 函数" << endl;
	}
	~Base() {
		cout << "Base 析构 函数" << endl;
	}
};
class son1 :public Base
{
public:
	son1() {
		cout << "son1 构造 函数" << endl;
	}
	~son1() {
		cout << "son1 析构 函数" << endl;
	}
};

void test01() {
	son1 ss1;
}
int main()
{
	test01();
	system("pause");
	return 0;
}
5.5 同名成员处理

访问子类同名成员,直接访问;访问父类同名(包括重载)成员,加作用域

#include<iostream>
using namespace std;
class Base
{
public:
	Base() {
		m_a = 100;
	}
	void func() {
		cout << "BASE函数\t" << endl;
	}
	void func(int a) {
		cout << "BASE(INT)函数\t" << endl;
	}
	int m_a;
};
class son1 :public Base
{
public:
	son1() {
		m_a = 900;
	}
	void func() {
		cout << "SON1函数\t" << endl;
	}
	int m_a;
};

void test01() {
	son1 ss1;
	cout << "子类中的SS1\t"<<ss1.m_a << endl;
	cout <<"父类中的SS1\t"<< ss1.Base::m_a << endl;
	ss1.func();
	ss1.Base::func();
	//ss1.func(100);//如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
	//如果想访问父类的同名函数,都要加作用域
	ss1.Base::func(100);
}
int main()
{
	test01();
	system("pause");
	return 0;
}
5.6 同名静态成员处理

同非静态成员同名情况处理方式一致

#include<iostream>
using namespace std;
class Base
{
public:
	static void func() {
		cout << "BASE函数\t" << endl;
	}
	static void func(int a) {
		cout << "BASE(INT)函数\t" << endl;
	}
	static int m_a;
};
int Base::m_a = 100;
class son1 :public Base
{
public:
	static void func() {
		cout << "SON1函数\t" << endl;
	}
	static int m_a;
};
int son1::m_a = 999;
void test01() {
	son1 ss1;
	cout << "通过对象访问数据" << endl;
	cout << "son1 的SS1\t"<<ss1.m_a << endl;
	cout <<"Base 的SS1\t"<< ss1.Base::m_a << endl;
	cout << endl << "通过类名访问数据" <<endl;//静态变量全局共享一个
	cout << "son1 的SS1\t" << son1::m_a << endl;
	cout << "Base 的SS1\t" << Base::m_a << endl;
	cout << "Base 的SS1\t" << son1::Base::m_a << endl;//son1::通过类目的方式访问Base::访问son1下Base作用域的M_A
	cout << endl << "通过对象访问函数" <<endl;
	ss1.func();
	ss1.Base::func();
	ss1.Base::func(100);
	cout << endl << "通过类名访问函数"  << endl;
	Base::func();
	son1::func();
	Base::func(100);
	son1::Base::func(100);
}
int main()
{
	test01();
	system("pause");
	return 0;
}
5.7 多继承语法

C++允许一个类继承多个类,语法:CLASS 子类:继承方式 父类1,继承方式,父类2……
父类中同名成员作用域区分,实际开发不建议使用

#include<iostream>
using namespace std;
class Base
{
public:
	Base() {
		_a = 100;
	}
	int _a;
};
class Base2
{
public:
	Base2() {
		_a = 99;
		_b = 200;
	}
	int _a;
	int _b;
};
class son :public Base,public Base2
{
public:
	son() {
		_c = 300;
		_d = 400;
	}
	int _c;
	int _d;
};

void test01() {
	son ss;
	cout << "sizeof(son)=\t" << sizeof(son) << endl;//全继承
	cout << "Base _a=\t" << ss.Base::_a << endl;
	cout << "Base2 _a=\t" << ss.Base2::_a << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}
5.8 菱形继承问题及解决办法

两个派生类继承同一个基类,又有某个类同时继承两个派生类——菱形(钻石)继承
问题:孙子类使用数据的时候会产生二义性,爷爷类的数据继承了两份,实际上只需要继承一份

解决办法:虚继承: 关键字VIRTUAL,虚基类
VBPTR:  V-IRTUAL, B-BASE, PTR-POINTER  虚基类指针,指向,VBTABLE虚基类表,

#include<iostream>
using namespace std;
class animal
{
public:
	int _big;
};
class sheep:virtual public animal {};//虚继承,animal类成为虚基类
class tuo :virtual public animal {};
class sheeptuo :public sheep,public tuo {};
void test01() {
	sheeptuo st;
	st.tuo::_big = 89;
	st.sheep::_big = 42;//共享一个数据,相当于给同一个数据赋值两次
	cout << "st._big=\t" << st._big << endl;//虚继承之后可以这么写,该数据只有一个
	cout << "st.tuo::_big=\t" << st.tuo::_big << endl;
	cout << "st.sheep::_big=\t" << st.sheep::_big << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

六,多态

6.1 基本语法

静态多态:函数重载,运算符重载,复用函数名
动态多态派生类和虚函数实现运行时多态

区别:静态多态的函数地址早绑定-编译阶段确定函数地址
动态多态的函数地址晚绑定-运行阶段确定函数地址

动态多态满足条件:有继承关系子类重写父类的虚函数(函数返回值,名称,参数列表完全相同-子类加不加VIRTUAL都行)
使用条件:父类的指针或者引用,指向子类的对象

#include<iostream>
using namespace std;
class animal
{
public:
	//加VIRTUAL关键字,实现晚绑定--小猫说话
	virtual void speak() {
		cout << "动物在说话" << endl;
	}
};
class dog :public animal{
public:
	void speak() {
		cout << "小狗在说话" << endl;
	}
};
class cat:public animal {
public:
	void speak() {
		cout << "小猫在说话" << endl;
	}
};
//地址早绑定,在编译阶段确定函数地址
//想猫说话,地址不能提前绑定,运行阶段再绑定,--》地址晚绑定
void dospeak(animal &animal) {
	animal.speak();
}
void test01() {
	cat catt;
	dospeak(catt);//父类的引用,接收了子类的对象,C++允许父类子类之间的类型转换     动物说话
	dog dogg;
	dospeak(dogg);//根据传入的对象不同执行函数
}
int main()
{
	test01();
	system("pause");
	return 0;
}
6.2 原理剖析

子类父类都记录了一个指针

#include<iostream>
using namespace std;
class animal
{
public:
	//加VIRTUAL关键字,实现晚绑定--小猫说话
	virtual void speak() {
		cout << "动物在说话" << endl;
	}
};
class dog :public animal{
public:
	void speak() {
		cout << "小狗在说话" << endl;
	}
};
class cat:public animal {
public:
	void speak() {
		cout << "小猫在说话" << endl;
	}
};
//地址早绑定,在编译阶段确定函数地址
//想猫说话,地址不能提前绑定,运行阶段再绑定,--》地址晚绑定
void dospeak(animal &animal) {
	animal.speak();
}
void test01() {
	cat catt;
	dospeak(catt);//父类的引用,接收了子类的对象,C++允许父类子类之间的类型转换     动物说话
	dog dogg;
	dospeak(dogg);//根据传入的对象不同执行函数
}
void test02() {
	cout << "sizeof(animal)=\t" << sizeof(animal) << endl;//不是虚函数,1,虚函数8,一个指针
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}
6.3 案例-计算器类

多态优点:代码组织结构清晰,可读性强,利于前期和后期的扩展及维护

#include<iostream>
using namespace std;
class Caculator
{
public:
	int num_;
	int num_1;
	int Getresult(string oper) {
		if (oper == "+") {
			return num_ + num_1;
		}
		else if (oper == "-") {
			return num_ - num_1;
		}
		else if (oper == "*") {
			return num_ * num_1;
		}
		else if (oper == "/" && num_1 != 0) {
			return num_ / num_1;
		}//如果想扩展新的功能,需要修改源码,真实开发中,开闭原则:开放扩展,关闭修改
	}
};
class Abstractcal {//计算机抽象类
public:
	virtual int getresult(){
		return 0;
	}
	int _num;
	int _num1;
};
class Addcal :public Abstractcal{
	int getresult() {
			return _num + _num1;
	}
};
class Subcal :public Abstractcal {
	int getresult() {
			return _num - _num1;
	}
};
class Mulcal :public Abstractcal {
	int getresult() {
		return _num * _num1;
	}
};
class Bescal :public Abstractcal {
	int getresult() {
		if (_num1 != 0) {
			return _num / _num1;
		}
	}
};
void test01()
{
	Caculator c;
	c.num_ = 90;
	c.num_1 = 23;
	cout << c.num_ << "+" << c.num_1 << "=" << c.Getresult("+") << endl;
	cout << c.num_ << "*" << c.num_1 << "=" << c.Getresult("*") << endl;
	cout << c.num_ << "-" << c.num_1 << "=" << c.Getresult("-") << endl;
	cout << c.num_ << "/" << c.num_1 << "=" << c.Getresult("/") << endl;
}
void test02() {
	//使用条件,父类指针直线子类对象
	Abstractcal* abc = new Addcal;//堆区开辟 存放 进行加法运算返回值的空间 返回指针
	abc->_num = 23;
	abc->_num1 = 2;
	cout << abc->_num<< "+" << abc->_num1 << "=" << abc->getresult() << endl;
	delete abc;//销毁,堆区的内存释放了,但是指针没有变
	abc = new Subcal;
	abc->_num = 23;
	abc->_num1 = 2;
	cout << abc->_num << "-" << abc->_num1 << "=" << abc->getresult() << endl;
	delete abc;
	abc = new Bescal;
	abc->_num = 23;
	abc->_num1 = 2;
	cout << abc->_num << "/" << abc->_num1 << "=" << abc->getresult() << endl;
	delete abc;
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}
6.4 纯虚函数和抽象类

多态中,父类中虚函数通常不实现,主要都是调用子类重写的内容,--》纯虚函数--》抽象类
语法:VIRTUAL 返回值类型 函数名(参数列表)=0;
特点:无法实例化对象,子类必须重写抽象类中的纯虚函数,否则也属于抽象类

#include<iostream>
using namespace std;
class Base//有则抽象类,无法实例化对象,子类必须重写纯虚函数否则抽象
{
public:
	virtual void func() = 0;//纯虚函数
};
class son:public Base {
public:
	void func() {
		cout << "func 函数调用" << endl;
	};
};
class son2 :public Base {
public:
	void func() {
		cout << "func2 函数调用" << endl;
	};
};
void test01()
{
	 //Base b;//不允许使用抽象类实例化对象
	son a;
	a.func();
	Base* base = new son;
	base->func();
	delete base;
	base = new son2;
	base->func();
}
void test02() {
	
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}
6.5 案例-制作饮品
#include<iostream>
using namespace std;
class AbstractDrinking
{
public:
	virtual void Boil() = 0;
	virtual void Brew() = 0;
	virtual void Pourincup() = 0;
	virtual void Putsomething() = 0;
	void Makedrinking() {
		Boil();
		Brew();
		Pourincup();
		Putsomething();
	}
};
class Makecoffee :public AbstractDrinking {
public:
	void Boil() {
		cout << "烧水至沸腾" << endl;
	 }
	void Brew() {
		cout << "冲泡咖啡" << endl;
	 }
	void Pourincup() {
		cout << "倒入杯中" << endl;
	 }
	void Putsomething() {
		cout << "加入糖和牛奶" <<endl<< endl;
	 }
};
class Tea :public AbstractDrinking {
public:
	void Boil() {
		cout << "烧水至沸腾" << endl;
	}
	void Brew() {
		cout << "加入茶叶" << endl;
	}
	void Pourincup() {
		cout << "倒入杯中" << endl;
	}
	void Putsomething() {
		cout << "加入柠檬" <<endl<< endl;
	}
};
void dowork(AbstractDrinking* tea) {
	tea->Makedrinking();
	delete tea;
}
void test01()
{
	AbstractDrinking* coffee = new Makecoffee;
	coffee->Makedrinking();
	delete coffee;
	AbstractDrinking* tea = new Tea;
	tea->Makedrinking();
	delete tea;
	dowork(new Tea);
}
int main()
{
	test01();
	system("pause");
	return 0;
}
6.6 虚析构和纯虚析构

多态使用时,如果子类有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
解决:将父类中的析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构
共性:可以解决父类指针释放子类对象,都需要具体的函数体现
区别:纯虚--抽象类--无法实例化对象

虚析构:VIRTUAL ~类名(){ }
纯虚析构:VIRTUAL~类名()=0;需要声明也需要实现

#include<iostream>
using namespace std;
class Animal {
public:
	Animal() {
		cout << "animal xu构造函数调用" << endl;
	}
	//改成虚析构,走猫的析构,再走animal的析构,解决父类指针释放子类对象时不干净的问题
	//虚析构走了,需要代码实现
	/*virtual ~Animal() {
		cout << "animal xu析构函数调用" << endl;
	}*/
	virtual ~Animal() = 0;//纯虚析构,报错,需要声明也需要具体实现,有了即抽象类
	virtual void speak() = 0;
};
Animal::~Animal() {
	cout << "animal 纯虚析构函数调用" << endl;
}
class Cat :public Animal {
public:
	Cat(string name) {
		cout << "cat 构造函数调用" << endl;
		m_name=new string(name);//堆区开辟空间放名字,返回名字的指针
	}
	~Cat() {
		if (m_name != NULL) {
			cout << "cat 析构函数调用" << endl;
			delete m_name;
			m_name = NULL;
		}
	}
	void speak() {
		cout << *m_name<<"miao miao miao " << endl;
	}
	string* m_name;
};
void test01()
{
	Animal* cat = new Cat("汤姆猫");
	cat->speak();
	//父类指针在析构的时候,不会调用子类中的析构函数,导致子类如果有堆区属性,出现内存泄露(没有释放?)
	delete cat;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

不要老在我要DDL的时候找我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#+unity基础

序列化&#xff1a; [SerializeField]&#xff0c;点不出来&#xff0c;只能在面板上显示绑定游戏物体 //公有隐藏 特有函数 特有函数&#xff1a;不需要调用&#xff0c;自动执行 Awake最先执行->OnEable 面向对象思想 面向对象思想&#xff1a;分为具体对象和抽象对…

从预训练损失的角度,理解语言模型的涌现能力

原文&#xff1a;Understanding Emergent Abilities of Language Models from the Loss Perspective 摘要 本文从预训练损失的角度重新审视语言模型的涌现能力&#xff0c;挑战了以往以模型大小或训练计算量为标准的观念。通过实验&#xff0c;作者发现预训练损失是预测下游任…

【算法】合并两个有序链表

本题来源---《合并两个有序链表》 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] /*** Definition for singl…

JavaSE——常用API进阶二(6/8)-ZoneId、ZoneDateTime、Instant(常见方法、用法示例)

目录 ZoneId 常见方法 用法示例 ZoneDateTime 常见方法 用法示例 Instant 常见方法 用法示例 如果在开发中我们有这样的需求&#xff1a;我们的系统需要获取美国现在的时间&#xff0c;或者其他地区的时间给用户观看&#xff0c;或者进行一些处理&#xff0c;那应该怎…

循环开关定时器(Smart PLC梯形图代码)

很多设备不需要复杂的逻辑时序控制,只需要实现简单的循环定时开关功能,对于这样的控制我们可以利用定时器组合去实现,但是如果系统里需要循环定时控制的设备比较多,那我们建议大家编写一个这样的循环定时开关功能块,SMART PLC循环开关定时器还可以参考下面文章链接 1、周…

短视频批量采集提取软件|视频关键词下载工具

短视频批量采集软件&#xff1a;快速抓取、高效下载 一、开发背景 随着短视频平台的兴起&#xff0c;获取并分析相关视频内容已成为许多业务的必要步骤。然而&#xff0c;传统的手动方式无法满足快速、批量获取的需求&#xff0c;因此我们开发了一款专业的短视频批量采集软件。…

FreeRTOS时间管理

FreeRTOS时间管理 主要要了解延时函数&#xff1a; 相对延时&#xff1a;指每次延时都是从执行函数vTaskDelay()开始&#xff0c;直到延时指定的时间结束。 绝对延时&#xff1a;指将整个任务的运行周期看成一个整体&#xff0c;适用于需要按照一定频率运行的任务。 函数 vTa…

springcloud第4季 springcloud-alibaba之sentinel

一 sentinel介绍 1.1 sentinel作用 sentinel是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。 1.2 组成部分 sen…

A Geolocation Databases Study(2011年)第五部分:Evalution Model

下载地址:A Geolocation Databases Study | IEEE Journals & Magazine | IEEE Xplore 被引次数:195 Shavitt Y, Zilberman N. A geolocation databases study[J]. IEEE Journal on Selected Areas in Communications, 2011, 29(10): 2044-2056. 5. Discussion 在我们讨…

Jenkins的安装和部署

文章目录 概述Jenkins部署项目的流程jenkins的安装启动创建容器进入容器浏览器访问8085端口 Jenkins创建项目创建example项目 概述 Jenkins&#xff1a;是一个开源的、提供友好操作界面的持续集成&#xff08;CLI&#xff09;工具&#xff0c;主要用于持续、自动构建的一些定时…

什么是知乎知+广告推广?

知乎作为中国领先的知识分享社区和高质量用户群体汇聚地&#xff0c;其广告价值日益凸显&#xff0c;其中&#xff0c;“知”作为知乎官方推出的创新广告形式&#xff0c;正逐渐成为品牌与消费者深度连接的重要桥梁。知广告推广不仅局限于传统意义上的硬性推广&#xff0c;更强…

C语言中与内存操作有关的一些函数

前提 最近在使用C语言在开发项目时&#xff0c;要对内存进行操作。刚开始写的时候有一点迷糊&#xff0c;看了一些东西后才发现为什么说指针是C语言的灵魂&#xff0c;因为它可以对内存直接进行操作&#xff0c;多么帅的事情&#xff0c;真的是太帅了。 malloc 声明在头文件…

混合现实(MR)开发框架

混合现实&#xff08;MR&#xff09;开发框架为开发者提供了构建MR应用程序所需的基本工具和功能。它们通常包括3D引擎、场景图、输入系统、音频系统、网络功能以及支持同时处理现实世界和虚拟世界信息的功能。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

【C语言】深入解析选择排序算法

一、算法原理二、算法性能分析三、C语言实现示例四、总结 一、算法原理 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是不断地选择剩余元素中的最小&#xff08;或最大&#xff09;元素&#xff0c;放到已排序的序列的末尾&#xff…

windows10环境下conda迁移到linux环境

网上给出的方案错误百出&#xff0c;记录一下正确方案。 1 创建yaml文件 创建到终端所在路径下 conda activate 环境名 conda env export --no-build >环境名.yaml2 新操作系统中创建新的conda环境 conda env create -f 环境名.yaml3 删除不兼容的包 终端报错 Could n…

西宁市初中生地会考报名照片尺寸要求及手机自拍方法

西宁市初中生地会考即将到来&#xff0c;对于参加考试的同学们来说&#xff0c;准备一张符合规格的报名照片是整个报名流程中不可或缺的一环。一张规范的证件照不仅展示了学生的精神面貌&#xff0c;同时也是顺利报名的重要条件之一。本文将详细介绍西宁市初中生地会考报名所需…

基于Springboot的社区帮扶对象管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区帮扶对象管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

可视化看板有那么多应用场景,该如何快速搭建?可视化工具该如何选择?

在当今的信息化时代&#xff0c;数据已经成为了现代决策的核心。无论是企业战略规划、运营管理&#xff0c;还是个人生活决策&#xff0c;数据都扮演着至关重要的角色。随着数据分析技术和工具的不断进步&#xff0c;数据在决策中的作用将变得更加突出&#xff0c;对组织和个人…

Stable Diffusion 模型分享:ChilloutMix(真实、亚洲面孔)chilloutmix_NiPrunedFp32Fix

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 相信近来吸引大家想一试 Stable Diffusion 图像生…

查看linux的主机配置脚本

废话不说 直接上指令 curl -Lso- bench.sh | bash 等待后&#xff0c;结果如图&#xff1a; 使用后没有问题&#xff0c;看情况使用 出事概不负责 介意勿用&#xff01;&#xff01;&#xff01;