C++核心编程之类和对象---C++面向对象的三大特性--多态

目录

一、多态

1. 多态的概念

2.多态的分类:

1. 静态多态:

2. 动态多态:

 3.静态多态和动态多态的区别:

4.动态多态需要满足的条件:

4.1重写的概念:

4.2动态多态的调用:

二、多态

三、多态的深入剖析

四、利用多态写一个模拟计算器案例

1.普通方式写一个模拟计算器

2.利用多态的方式写一个计算器

五、纯虚函数和抽象类

抽象类特点:

六、利用多态的抽象类写一个饮品制作流程的案例

七、纯析构和纯虚析构

虚析构和纯虚析构的共性:

虚析构和纯虚析构的区别:

总结:

八、利用多态写一个组装电脑的案例


一、多态

1. 多态的概念

计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。

多态也可定义为“一种将不同的特殊行为和单个泛化记号相关联的能力”。

多态可分为变量多态与函数多态。变量多态是指:基类型的变量(对于C++是引用或指针)可以被赋值基类型对象,也可以被赋值派生类型的对象。函数多态是指,相同的函数调用界面(函数名与实参表),传送给一个对象变量,可以有不同的行为,这视该对象变量所指向的对象类型而定。因此,变量多态是函数多态的基础。 

多态是c++面向对象的三大特性之一

2.多态的分类:

1. 静态多态:

      函数重载 和 运算符重载 属于静态多态,复用函数名

     静态多态(static polymorphism):模板也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为“静态”。可以用来实现类型安全、运行高效的同质对象集合操作。C++STL不采用动态多态来实现就是个例子。

  • 函数重载(Function Overloading)

  • 运算符重载(Operator Overloading)

  • 带变量的宏多态(macro polymorphism)

  • 非参数化多态或译作特设多态(Ad-hoc polymorphism):

  • 参数化多态(Parametric polymorphism):把类型作为参数的多态。在面向对象程序设计中,这被称作泛型编程。

2. 动态多态:

    派生类 和 虚函数 实现运行时多态

   动态多态(dynamic polymorphism):通过类继承机制和虚函数机制生效于运行期。可以优雅地处理异质对象集合,只要其共同的基类定义了虚函数的接口。也被称为子类型多态(Subtype polymorphism)或包含多态(inclusion polymorphism)。在面向对象程序设计中,这被直接称为多态。

对于C++语言,带变量的宏和函数重载(function overload)机制也允许将不同的特殊行为和单个泛化记号相关联。然而,习惯上并不将这种函数多态(function polymorphism)、宏多态(macro polymorphism)展现出来的行为称为多态(或静态多态),否则就连C语言也具有宏多态了。谈及多态时,默认就是指动态多态,而静态多态则是指基于模板的多态。

 3.静态多态和动态多态的区别:

        1. 静态多态的函数地址早绑定,编译阶段确定函数地址

        2. 动态多态的函数地址晚绑定,运行阶段确定函数地址

4.动态多态需要满足的条件:

        1.有继承关系

        2.子类中重写父类的虚函数(子类中写不写virtual都可以)

4.1重写的概念:

        函数返回值类型  函数名  参数列表都完全相同。

        注意:与函数重载要区分。

4.2动态多态的调用:

        父类的指针或引用  执行子类对象

二、多态

示例:

#include<iostream>using namespace std;// 多态// 动态多态的满足条件// 1. 有继承关系// 2. 子类要重写父类的虚函数// 动态多态的使用// 父类的指针或引用  指向子类对象// 动物类class Animal{public:// 虚函数virtual void speak(){cout<<"动物在说话"<<endl;}};// 猫类class Cat:public Animal{public:// 重写  函数返回值类型  函数名 参数列表要   完全相同void speak(){cout<<"猫在说话"<<endl;}};// 狗类class Dog:public Animal{public:void speak(){cout<<"狗在说话"<<endl;}};// 执行说话的函数void dospeak(Animal &animal) // Animal & animal  =  cat;{// 地址早绑定  在编译阶段确定函数地址// 如果要执行猫说话,那么这个函数地址就不能提前绑定// 需要在运行阶段进行绑定,地址晚绑定animal.speak();}// c++允许父类和子类的转化void test01(){Cat cat;// cat.speak();dospeak(cat);  // 父类的引用,接收的是子类的对象Dog dog;dospeak(dog);}int main(){test01();return 0;}

没写 virtual 之前是地址早绑定

写入虚函数后,地址晚绑定运行结果:

 

三、多态的深入剖析

图解示例:

示例:

#include<iostream>using namespace std;// 多态的底层逻辑// 动物类class Animal{public:// 虚函数void speak(){cout << "动物在说话" << endl;}};// 猫类class Cat :public Animal{public:// 重写  函数返回值类型  函数名 参数列表要   完全相同void speak(){cout << "猫在说话" << endl;}};// 狗类class Dog :public Animal{public:void speak(){cout << "狗在说话" << endl;}};// 执行说话的函数void dospeak(Animal& animal){// 地址早绑定  在编译阶段确定函数地址// 如果要执行猫说话,那么这个函数地址就不能提前绑定// 需要在运行阶段进行绑定,地址晚绑定animal.speak();}// c++允许父类和子类的转化void test01(){Cat cat;// cat.speak();dospeak(cat);  // 父类的引用,接收的是子类的对象Dog dog;dospeak(dog);}void test02(){cout << "Animal 类的大小:" << sizeof(Animal) << endl;}int main(){test01();test02();return 0;}

通过命令提示符查看

加入虚函数后

子类在没有重写的时候

子类重写虚函数后

没加virtual的类的大小,相当于空类,大小是1

变为虚函数后的类的大小为8/4(看你的编译器是多少位的),类的大小是一个指针的大小

关于命令提示符查看类可查询上一篇文章:命令提示符查看类

四、利用多态写一个模拟计算器案例

多态的优点:

  • 代码组织结构清晰
  • 可读性强
  • 利于前期和后期的扩展及维护

1.普通方式写一个模拟计算器

示例1:

#include<iostream>using namespace std;// 分别利用普通写法和多态的技术实现计算器的功能// 普通的写法class Calculator{public:int get_result(string oper){if(oper == "+")return m_num1+m_num2;if(oper == "-")return m_num1 - m_num2;if(oper == "*")return m_num1 * m_num2;if(oper == "/")return m_num1 / m_num2;}int m_num1;int m_num2;};void test01(){Calculator c;c.m_num1 = 40;c.m_num2 = 20;// 开闭原则,对扩展进行开放,对修改进行关闭cout<<c.m_num1<<" + "<<c.m_num2<<" = "<<c.get_result("+")<<endl;cout<<c.m_num1<<" - "<<c.m_num2<<" = "<<c.get_result("-")<<endl;cout<<c.m_num1<<" * "<<c.m_num2<<" = "<<c.get_result("*")<<endl;cout<<c.m_num1<<" / "<<c.m_num2<<" = "<<c.get_result("/")<<endl;}int main(){test01();return 0;}

运行结果:

2.利用多态的方式写一个计算器

示例2:

#include<iostream>using namespace std;// 利用多态实现计算器class Abstract_Calculator{public:virtual int get_result(){return 0;}int num1;int num2;};// 设计一个加法计算器的类class Add_Calculator:public Abstract_Calculator{public:int get_result(){return num1+num2;}};// 设计一个减法计算器的类class Sub_Calculator:public Abstract_Calculator{public:int get_result(){return num1-num2;}};// 设计一个乘法计算器的类class Mul_Calculator:public Abstract_Calculator{public:int get_result(){return num1*num2;}};void test02(){// 多态的使用条件// 父类的指针或引用指向子类对象// 加法运算Abstract_Calculator *abc = new Add_Calculator;abc->num1 = 100;abc->num2 = 200;cout<<abc->num1<<" + "<<abc->num2<<" = "<<abc->get_result()<<endl;// 堆区数据用完记得销毁delete abc;// 减法运算abc = new Sub_Calculator;abc->num1 = 200;abc->num2 = 100;cout<<abc->num1<<" - "<<abc->num2<<" = "<<abc->get_result()<<endl;delete abc;// 乘法运算abc = new Mul_Calculator;abc->num1 = 200;abc->num2 = 100;cout<<abc->num1<<" * "<<abc->num2<<" = "<<abc->get_result()<<endl;delete abc;}int main(){test02();return 0;}

运行结果:

五、纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要是调用子类的重写内容

因此可以将虚数改为纯虚数

纯虚数语法: virtual 返回值类型 函数名(参数列表) =  0 ;

当类中有了纯虚函数,这个类称为抽象类

抽象类特点:

  1. 无法实例化对象
  2. 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

示例:

#include<iostream>using namespace std;// 纯虚数抽象类class Base{public:virtual void func() = 0; // 虚函数的基础上才可以等于0,纯虚函数// 只要有一个纯虚数,这个类称为抽象类};// 抽象类的子类,必须要重写父类中的纯虚函数,否则也是抽象类,无法实例化对象class Son:public Base{public:void func(){cout<<"func函数调用"<<endl;}};void test01(){// Base b; 无法实例化一个抽象类// new 一个也不行Base *base = new Son;base->func();}int main(){test01();return 0;}

运行结果:

六、利用多态的抽象类写一个饮品制作流程的案例

案例描述:利用多态技术,提供抽象类制作饮品基类,提供子类制作咖啡和茶叶

示例:

#include<iostream>using namespace std;class Abstract_Drinking{public:// 煮水virtual void Boil() = 0;// 冲泡virtual void Brew() = 0;// 倒入杯中virtual void Pour_Cup() = 0;// 加入辅助佐料virtual void Put_something() = 0;// 制作饮品void make_drink(){Boil();Brew();Pour_Cup();Put_something();}};// 具体的制作// 咖啡class Coffee:public Abstract_Drinking{public:// 煮水virtual void Boil(){cout<<"煮矿泉水"<<endl;}// 冲泡virtual void Brew(){cout<<"冲泡咖啡"<<endl;}// 倒入杯中virtual void Pour_Cup(){cout<<"倒入杯中"<<endl;}// 加入辅助佐料virtual void Put_something(){cout<<"加入糖和牛奶"<<endl;}};// 茶class Tea:public Abstract_Drinking{public:// 煮水virtual void Boil(){cout<<"煮矿泉水"<<endl;}// 冲泡virtual void Brew(){cout<<"冲泡茶叶"<<endl;}// 倒入杯中virtual void Pour_Cup(){cout<<"倒入杯中"<<endl;}// 加入辅助佐料virtual void Put_something(){cout<<"加入柠檬,枸杞"<<endl;}};// 制作void do_work(Abstract_Drinking * abd)// Abstract_Drinking *abd = new Coffee  父类指针指向子类对象{abd->make_drink();delete abd;// 在堆区制作完记得释放}void test01(){// 制作咖啡do_work(new Coffee);cout<<"-------------"<<endl;// 制作茶do_work(new Tea);}int main(){test01();return 0;}

运行结果:

七、纯析构和纯虚析构

问题:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。

解决办法:将父类中的析构函数改为**虚析构**或者**纯虚析构**

虚析构和纯虚析构的共性:

  • 可以解决父类指针释放子类对象
  • 都需要有具体的函数实现

虚析构和纯虚析构的区别:

  • 如果是纯虚析构,该对象属于抽象类,无法实现实例化对象

**虚析构语法:**

virtual ~类名(){}

**纯虚析构语法:**

virtual ~类名()= 0;

类名::~类名(){} // 类内声明,类外实现

示例:

#include<iostream>using namespace std;// 虚析构和纯虚析构class Animal{public:Animal(){cout<<"Animal的构造函数的调用"<<endl;}virtual void speak() = 0;// 变为纯虚函数// 利用虚析构可以解决  父类指针释放子类对象时不干净的问题/*virtual ~Animal(){cout<<"Animal虚析构函数的调用"<<endl;}*/virtual ~Animal() = 0;// 纯虚析构// 需要声明  也需要实现// 有了纯虚析构之后,那么这个类也属于抽象类,无法实现实例化对象};Animal::~Animal(){cout<<"Animal纯虚析构函数的调用"<<endl;}class Cat: public Animal{public:Cat(string name){cout<<"这是Cat的构造函数的调用"<<endl;this->name = new string(name);}void speak(){cout<<*name<<"小猫在说话"<<endl;}~Cat(){if(this->name!=NULL){cout<<"这是Cat的析构函数的调用"<<endl;delete this->name;this->name = NULL;}}string *name;// 创建在堆区};void test01(){Animal *animal = new Cat("Tom");animal->speak();// 父类的指针在析构的时候不会调用子类的析构函数// 导致子类如果在堆区有数据,会出现内存泄漏的情况delete animal;}int main(){test01();return 0;}

运行结果:

总结:

  1. 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
  2. 如果子类中没有堆区数据,可以不写为虚析构或者纯虚析构
  3. 拥有纯虚析构函数的类也属于抽象类

八、利用多态写一个组装电脑的案例

案例说明:

电脑主要组成部件为CPU(用于计算),显卡〔用于显示),内存条〔用于存储)

将每个零件封装出抽象基类,并且提供不同的厂商生产不同的霉件,例如Intel厂商和Lenovo厂商

创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口

测试时组装三台下同的电脑进行工作

示例:

#include<iostream>using namespace std;// 抽象不同零件的类// 计算机类class CPU{public:// 抽象的计算函数virtual void calculate() = 0;};// 显卡类class Video_Card{public:// 抽象的显示函数virtual void display() = 0;};// 内存条类class Memory{public:// 抽象的存储函数virtual void storage() = 0;};// 提供电脑类class Computer{public:Computer(CPU* cpu, Video_Card* vc, Memory* mem){this->cpu = cpu;this->vc = vc;this->mem = mem;}// 提供工作函数void work(){// 让零件工作起来,调用接口this->cpu->calculate();this->vc->display();this->mem->storage();}// 提供析构函数  释放在堆区创建的三个零件~Computer(){if(cpu!=NULL){delete cpu;cpu = NULL;}if(vc!=NULL){delete vc;vc = NULL;}if(mem!=NULL){delete mem;mem = NULL;}}private:CPU* cpu;  // CPU的零件指针Video_Card* vc;  // 显卡的零件指针Memory* mem;  // 内存条的零件指针};// 具体厂商// Intel厂商// CPUclass Intel_CPU :public CPU{public:void calculate(){cout << "这是Intel厂商的CPU,并且开始计算了" << endl;}};// 显卡class Intel_Video_Card :public Video_Card{public:void display(){cout << "这是Intel厂商的显卡,并且开始显示了" << endl;}};// 内存条class Intel_Memory :public Memory{void storage(){cout << "这是Intel厂商的内存条,并且开始存储了" << endl;}};// Lenovo厂商// CPUclass Lenovo_CPU :public CPU{public:void calculate(){cout << "这是Lenovo厂商的CPU,并且开始计算了" << endl;}};// 显卡class Lenovo_Video_Card :public Video_Card{public:void display(){cout << "这是Lenovo厂商的显卡,并且开始显示了" << endl;}};// 内存条class Lenovo_Memory :public Memory{void storage(){cout << "这是Lenovo厂商的内存条,并且开始存储了" << endl;}};void test01(){cout<<"------------------------"<<endl;cout<<"第一台电脑开始工作"<<endl;// 创建第一台电脑的零件CPU* intel_CPU = new Intel_CPU;Video_Card* intel_videocard = new Intel_Video_Card;Memory* intel_memory = new Intel_Memory;// 创建电脑零件的时候时在堆区创建的// 创建第一台电脑Computer* computer1 = new Computer(intel_CPU, intel_videocard, intel_memory);computer1->work();delete computer1;cout<<"-----------------------"<<endl;cout<<"第二台电脑开始工作"<<endl;// 组装第二台电脑Computer* computer2 = new Computer(new Lenovo_CPU, new Lenovo_Video_Card, new Lenovo_Memory);computer2->work();delete computer2;cout<<"-----------------------"<<endl;cout<<"第三台电脑开始工作"<<endl;// 组装第三台电脑Computer* computer3 = new Computer(new Lenovo_CPU, new Intel_Video_Card, new Lenovo_Memory);computer3->work();delete computer3;}int main(){test01();return 0;}

运行结果:

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

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

相关文章

散列函数,哈希表hash table

附上一句话&#xff1a;我知道大家可能曾经了解过这个散列表了&#xff0c;我发现&#xff0c;如果多看几个相关的视频&#xff0c;从不同的表述方式和不同的理解角度来理解这个问题&#xff0c;我会明白的更透彻&#xff0c;也有更多新的收获&#xff0c;尤其是对这个算法的应…

【PostgreSQL】安装和常用命令教程

PostgreSQL window安装教程 window安装PostgreSQL 建表语句&#xff1a; DROP TABLE IF EXISTS student; CREATE TABLE student (id serial NOT NULL,name varchar(100) NOT NULL,sex varchar(5) NOT NULL,PRIMARY KEY (id) );INSERT INTO student (id, name, sex) VALUES (…

无人超市系统的设计与实现:从需求分析到实际应用

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Python超详细基础文件操作(详解版)

一、文件操作 1. 文件打开与关闭 1.1 打开文件 在Python中&#xff0c;你可以使用 open() 函数来打开文件。 以下是一个简单的例子&#xff1a; # 打开文件&#xff08;默认为只读模式&#xff09; file_path example.txt with open(file_path, r) as file:# 执行文件操作…

C语言天花板——指针(进阶2)

好久不见了各位&#xff0c;甚是想念啊&#xff01;&#xff01;&#xff01;&#x1f3b6;&#x1f3b6;&#x1f3b6; 文章接上次的指针(进阶1)(http://t.csdnimg.cn/c39SJ)&#xff0c;我们继续发车咯&#x1f697;&#x1f697;&#x1f697; 五、函数指针 上次我们只是浅…

网卡唯一标识你了解吗?MAC地址详解

本文内容&#xff1a; MAC地址概述 MAC地址组成 单播、组播、广播MAC地址 本地管理和全球管理MAC地址 一、MAC地址概述 MAC地址&#xff08;Media Access Control Address&#xff09;的全称叫做媒体访问控制地址&#xff0c;也称作局域网地址&#xff0c;以太网地址或者物…

爆了,AI表情包制作全攻略揭秘

今天来一篇绝对的干货 在AI如火如荼的今天&#xff0c;各行各业各个领域都有AI的身影&#xff0c;今天给大家一篇AI制作表情包的教程&#xff0c;希望大家都能在AI的浪潮中找到自己的位置 一、制作篇 正常来说需要使用 midjourney&#xff0c;但是目前限制比较多&#xff0c…

【Vue3】3-2 : 组件的概念及组件的基本使用方式

本书目录&#xff1a;点击进入 一、组件的概念 1.1、为什么要做成组件 1.2、【案例】评分组件与按钮组件的抽离过程 二、组件的使用 - 抽离结构 2.1、【案例】简易首页 &#xff1e; 效果 &#xff1e; 代码 - 原始 &#xff1e; 代码 - 组件抽离结构 &#xff1e;…

如何在Windows 10/11的防火墙中禁止和允许某个应用程序,这里提供详细步骤

想阻止应用程序访问互联网吗&#xff1f;以下是如何通过简单的步骤阻止和允许Windows防火墙中的程序。​ 一般来说&#xff0c;大多数用户永远不需要担心应用程序访问互联网。然而&#xff0c;在某些情况下&#xff0c;你需要限制应用程序访问互联网。 例如&#xff0c;有问题…

jmeter--4.参数化的方式

目录 1. 用户定义的变量 2. 用户参数 3. 函数助手 3.1 time获取当前时间 3.2 Random随机数 3.3 随机字符串函数 3.4 字符串变更为大写 4. CSV数据文件设置 5. 接口关联--正则和json等提取 1. 用户定义的变量 线程组->添加->配置元件->用户定义的变量 引用方…

安达发|APS工序排程甘特图功能介绍

工序排程甘特图的主要功能 1. 显示工序时间安排&#xff1a;工序排程甘特图可以清晰地展示生产过程中各个工序的开始时间、结束时间和持续时间&#xff0c;从而帮助企业了解生产过程中各个环节的时间安排。 2. 显示工序进度情况&#xff1a;通过工序排程甘特图&#xff0c;企业…

计算机毕业设计-----SSH高校科研管理系统平台

项目介绍 本项目包含超级管理员、管理员、教师三种角色&#xff1b; 超级管理员角色包含以下功能&#xff1a; 登录,教师管理,管理员管理等功能。 管理员角色包含以下功能&#xff1a; 登录,专业参赛奖项管理,科技论文发表管理,出版专业著作管理,科研项目立项管理,科研项目结…

数据结构--排序

参考【算法】排序算法之希尔排序 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/122632213 1. 排序的定义 2. 插入排序 2.1 直接插入排序 在插入第i&#xff08;i>1)个记录时&#xff0c;前面的i-1个记录已经排好序 void insertSort(int r[],int n) {for(int i2;i<…

《WebKit 技术内幕》之二: HTML 网页和结构

第二章 HTML 网页和结构 HTML网页是利用HTML语言编写的文档&#xff0c;HTML是半结构化的数据表现方式&#xff0c;它的结构特征可以归纳为&#xff1a;树状结构、层次结构和框结构。 1.网页构成 1.1 基本元素和树状结构 HTML网页使用HTML语言撰写的文档&#xff0c;发展到今…

合适的索引顺序

一.前言 正确的顺序依赖于使用索引的查询,并且同时需要考虑如何更好地满足排序和分组的需要。因为哈希或者其他类型的索引并不会像 B-Tree索引一样顺序存储数据,所以这里只针对B-Tree展开讨论。 二.合适的索引顺序 1. 概念 对于如何选择索引顺序有一个经验法则: 将选择性最…

hcip-4

ISIS:中央系统到中央系统 基于OSI模型开发&#xff1b; 集成的ISIS&#xff0c;基于OSI开发后转移到TCP/IP模型执行&#xff1b; 故集成的ISIS既可以在OSI模型&#xff0c;也可在TCP/IP模型工作&#xff1b; ISIS是在ISP中使用的一个IGP协议&#xff0c;其归属于无类别链路状…

HashData湖仓一体方案:方案概览与Hive数据同步

随着云计算、大数据、AI的发展和普及&#xff0c;各行各业的业务场景日益复杂&#xff0c;数据呈现出大规模、多样性的特点&#xff0c;企业对数据仓库的需求也进一步拓展至对多元化数据实时处理的场景。 数据湖是多元数据存储与使用的便捷选择&#xff0c;而云原生具有数据资…

谷歌aab包在Android 14闪退而apk没问题(targetsdk 34)

问题原因 Unity应用(target SDK 34)上线到GooglePlay&#xff0c;有用户反馈fold5设备上&#xff08;Android14系统&#xff09;疯狂闪退&#xff0c;经测试&#xff0c;在小米手机Android14系统的版本复现成功了&#xff0c;奇怪的是apk直接安装没问题&#xff0c;而打包成aa…

浙大恩特客户资源管理系统CrmBasicAction.entcrm接口存在任意文件上传漏洞

@[toc] 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 浙大恩特客户资源管理系统接口简介 微信公…

搭建eureka-server

首先要搭建注册中心服务端&#xff1a;eureka-server&#xff0c;这必须是一个独立的微服务 1.创建项目 创建maven工程即可 2.引入依赖 提示&#xff1a;starter是springboot中的自动装配&#xff0c;在这个依赖里&#xff0c;已经帮我们把eureka的所有配置都做好了 <de…