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

继承与多态 - 继承机制、虚函数、纯虚函数

引言

C++ 是一种支持面向对象编程(OOP)的编程语言,继承和多态是 OOP 的两个核心概念。通过继承,我们可以创建新的类,这些新类可以重用现有类的代码,并且可以根据需要进行扩展或修改。多态则允许我们编写更加通用和灵活的代码,使得程序可以在运行时根据对象的实际类型执行不同的操作。

本文将详细介绍 C++ 中的继承机制、虚函数和纯虚函数的概念及其使用方法,帮助读者理解并掌握这些重要的 OOP 特性。


1. 继承机制

1.1 定义继承

继承是面向对象编程中的一个重要特性,它允许一个类(子类)从另一个类(父类或基类)继承属性和行为。通过继承,子类不仅可以重用父类的代码,还可以添加新的功能或修改已有的功能。

在 C++ 中,使用 class 关键字定义类,并通过冒号和关键字 publicprotected 或 private 来指定继承方式:

class BaseClass {
public:void baseFunction() {std::cout << "Base function called." << std::endl;}
};class DerivedClass : public BaseClass {
public:void derivedFunction() {std::cout << "Derived function called." << std::endl;}
};

在这个例子中,DerivedClass 继承了 BaseClass,因此它可以访问 BaseClass 中的公共成员函数 baseFunction()

1.2 继承方式

C++ 支持三种继承方式:

  • 公有继承 (public):子类可以访问父类的公有和保护成员,但不能访问私有成员。子类的对象也可以访问父类的公有成员。
  • 保护继承 (protected):子类可以访问父类的公有和保护成员,但不能访问私有成员。子类的对象不能访问父类的任何成员。
  • 私有继承 (private):子类只能访问父类的公有和保护成员,但这些成员在子类中变为私有成员。子类的对象不能访问父类的任何成员。

选择合适的继承方式取决于具体的设计需求。通常情况下,公有继承是最常用的继承方式。

1.3 构造函数和析构函数

当一个类继承自另一个类时,构造函数和析构函数的行为也会受到影响。子类的构造函数会先调用父类的构造函数,然后再初始化自己的成员变量。同样,子类的析构函数会在父类的析构函数之前被调用。

class BaseClass {
public:BaseClass() {std::cout << "Base constructor called." << std::endl;}~BaseClass() {std::cout << "Base destructor called." << std::endl;}
};class DerivedClass : public BaseClass {
public:DerivedClass() {std::cout << "Derived constructor called." << std::endl;}~DerivedClass() {std::cout << "Derived destructor called." << std::endl;}
};int main() {DerivedClass obj;return 0;
}

输出结果:

Base constructor called.
Derived constructor called.
Derived destructor called.
Base destructor called.

2. 虚函数

2.1 定义虚函数

虚函数是实现多态的关键。通过虚函数,我们可以在派生类中重写基类的函数,并在运行时根据对象的实际类型调用相应的函数版本。

在 C++ 中,使用 virtual 关键字来声明虚函数:

class BaseClass {
public:virtual void show() {std::cout << "Base class show function." << std::endl;}
};class DerivedClass : public BaseClass {
public:void show() override {std::cout << "Derived class show function." << std::endl;}
};

在这个例子中,BaseClass 中的 show() 函数被声明为虚函数,而 DerivedClass 重写了这个函数。当我们通过基类指针或引用来调用 show() 函数时,实际调用的是派生类的版本:

int main() {BaseClass* ptr = new DerivedClass();ptr->show(); // 输出: Derived class show function.delete ptr;return 0;
}

2.2 虚函数表

C++ 编译器为每个包含虚函数的类生成一个虚函数表(vtable),其中包含了该类所有虚函数的地址。当通过基类指针或引用调用虚函数时,编译器会根据对象的实际类型查找对应的虚函数地址并调用它。

2.3 override 和 final 关键字

  • override:用于显式声明派生类中的函数是重写基类的虚函数。如果派生类中的函数名称或签名不匹配基类的虚函数,编译器会报错。
  • final:用于禁止派生类进一步重写某个虚函数。
class BaseClass {
public:virtual void show() = 0; // 纯虚函数
};class DerivedClass : public BaseClass {
public:void show() override final {std::cout << "Derived class show function." << std::endl;}
};

3. 纯虚函数

3.1 定义纯虚函数

纯虚函数是一种特殊的虚函数,它没有具体的实现,只提供函数声明。包含纯虚函数的类被称为抽象类,不能直接实例化。纯虚函数的作用是为派生类提供一个接口,要求派生类必须实现该函数。

在 C++ 中,使用 = 0 来声明纯虚函数:

class BaseClass {
public:virtual void show() = 0; // 纯虚函数
};class DerivedClass : public BaseClass {
public:void show() override {std::cout << "Derived class show function." << std::endl;}
};

3.2 抽象类

包含纯虚函数的类称为抽象类。抽象类不能直接实例化,但可以通过派生类来实现其接口。

int main() {// BaseClass obj; // 错误:不能实例化抽象类DerivedClass obj;obj.show(); // 正确:通过派生类实例化并调用return 0;
}

3.3 混合使用虚函数和纯虚函数

有时我们希望某些函数在基类中有默认实现,而另一些函数则强制派生类实现。这时可以混合使用虚函数和纯虚函数:

class BaseClass {
public:virtual void show() = 0; // 纯虚函数virtual void display() {std::cout << "Base class display function." << std::endl;}
};class DerivedClass : public BaseClass {
public:void show() override {std::cout << "Derived class show function." << std::endl;}
};

总结

继承和多态是 C++ 面向对象编程的核心特性。通过继承,我们可以重用代码并扩展功能;通过虚函数和纯虚函数,我们可以实现多态,编写更加灵活和通用的代码。理解这些概念对于编写高质量的 C++ 程序至关重要。

希望本文能够帮助您更好地理解 C++ 中的继承机制、虚函数和纯虚函数。如果您有任何问题或建议,请随时留言讨论!


参考资料:

  • C++ Primer
  • Effective Modern C++

相关文章:

继承与多态 - 继承机制、虚函数、纯虚函数

引言 C 是一种支持面向对象编程&#xff08;OOP&#xff09;的编程语言&#xff0c;继承和多态是 OOP 的两个核心概念。通过继承&#xff0c;我们可以创建新的类&#xff0c;这些新类可以重用现有类的代码&#xff0c;并且可以根据需要进行扩展或修改。多态则允许我们编写更加…...

微信小程序:正确输出<小于,大于>符号

错误写法 1、如果直接输入<符号会直接报错&#xff0c;>能正常使用&#xff0c;如图标红的是错误写法 2、输入html的<&gt的写法&#xff0c;会原样输入符号 解决方法 采用变量的方式输出 1、js写入变量 2、wxml直接写...

uni-app tab 双击事件监听

1、data中定义属性&#xff0c;用于临时记录点击次数 tabClick: {touchNum: 0 },2、添加页面事件监听方法 onTabItemTap(e) {this.tabClick.touchNumsetTimeout(()>{if(this.tabClick.touchNum > 2){// 双击执行代码区}this.tabClick.touchNum 0}, 250) },个人博客&am…...

GIT 企业级开发学习 1_基本操作

本节主要命令&#xff1a; git init ls 不能列出 .git ls -a 列出 .git 创建本地仓库 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库&#xff0c;在当前目录下生成一个 .git 隐藏文件夹&#xff0c;用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls …...

Computed在Vue2、Vue3写法的不同

在 Vue 2 和 Vue 3 中&#xff0c;computed 的写法有一些区别&#xff0c;特别是在 Vue 3 中新增了组合式 API 和 setup 语法糖。以下是不同写法的详细比较&#xff1a; 1. Vue 2 选项式 API 写法 在 Vue 2 中&#xff0c;computed 是一个选项&#xff0c;直接在 computed 对…...

Hive集群安装部署

上传安装包并解压 cd /ddhome/tools tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /ddhome/bin/ cd /ddhome/bin/ mv apache-hive-3.1.2-bin hive注意&#xff1a;如果Hive要使用Spark计算引擎&#xff0c;需要重新编译Hive&#xff0c; 这里已经编译完毕 修改配置文件 cd …...

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…...

Gitea代码仓服务搭建

特点与优势 轻量级:Gitea是一个轻量级的Git服务,提供了快速、稳定的代码托管和协作开发环境。它资源占用低,适合在资源受限的环境中运行。易于安装和部署:Gitea提供了简单易用的安装和部署方式,支持多种安装方式,包括二进制文件、Docker容器等,并提供了详细的文档和配置…...

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java Virtual Machine&#xff0c;Java虚…...

docker 安装influxdb

docker pull influxdb mkdir -p /root/influxdb/data docker run -d --name influxdb -p 8086:8086 -v /root/influxdb/data:/var/lib/influxdb influxdb:latest#浏览器登录&#xff1a;http://192.168.31.135:8086&#xff0c;首次登录设置用户名密码&#xff1a;admin/admin1…...

TLS: WebRTC中ThreadManager的线程局部存储

1. 什么是线程局部存储&#xff1a; 线程局部存储&#xff08;TLS&#xff0c;Thread-Local Storage&#xff09;&#xff1a; 线程局部存储&#xff08;TLS&#xff09;允许每个线程保存一份独立的数据副本&#xff0c;避免多个线程共享数据导致的竞争问题。 每个线程可以根…...

[Qt] 万字详解 | 常用控件 | Button | Label | LCD | ProgressBar

目录 按钮类控件 1、Push Button 按钮 2、Radio Buttion 单选 click、press、release、toggled 的区别 3、Check Box 复选 4、Tool Button 显示类控件 1、Label 2、LCD Number 3、ProgressBar 4、Calendar Widget 按钮类控件 1、Push Button 按钮 概述&#xff1a…...

【数据仓库】hadoop3.3.6 安装配置

文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本&#xff0c;所以有些配置&#xff0c;是可以不用做的&#xff0c;下面仅记录新增操作&#…...

ffmpeg八大开发库

‌FFmpeg八大库‌是指FFmpeg项目中最重要的八个库&#xff0c;它们各自承担不同的功能&#xff0c;共同构成了FFmpeg的强大功能。以下是这八大库的详细介绍&#xff1a; ‌libavcodec‌&#xff1a;负责音频和视频的编解码。它支持多种编解码器&#xff0c;如H.264、AAC、MP3、…...

Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能

Uniapp中使用wxml-to-canvas开发DOM生成图片功能 在移动端开发中&#xff0c;生成图片是一个常见需求&#xff0c;例如用于分享海报、生成动态二维码等。在Uniapp框架中&#xff0c;我们可以通过wxml-to-canvas插件轻松实现将DOM转化为图片的功能。本文将详细介绍如何在Uniapp…...

【09】深入解析 Three.js 官网示例:下雪粒子特效与场景渲染的实现(webgpu_compute_particles_snow.html)

引言 Three.js 是一个强大的 JavaScript 库&#xff0c;用于在网页上创建和渲染 3D 场景。本文将深入分析一段 Three.js 官网示例代码&#xff0c;详细解释其实现思路和主要功能代码&#xff0c;帮助读者更好地理解和掌握 Three.js 的应用。官网代码地址&#xff1a;https://g…...

电子价签会是零售界的下一个主流?【新立电子】

电子价签&#xff0c;作为一种能够替代传统纸质标签的数字显示屏&#xff0c;已经在零售行业中展现出其巨大的潜力。它具有实时更新、集中管理、高效节能的特点&#xff0c;实现价格的实时更新&#xff0c;大大减少更新价格的工作量和时间。为消费者带来更加便捷、准确的购物体…...

uniapp——App下载文件,保存、打开文件(二)

uniapp如何下载文件、保存、打开文件 时光荏苒&#xff0c;2024即将过去&#xff01; 迈向2025&#xff0c;祝大家新的一年工作顺利、万事如意&#xff0c;少一点BUG&#xff0c;涨一点工资…↖(ω)↗ 文章目录 uniapp如何下载文件、保存、打开文件下载文件保存并打开文件处理 …...

如何轻松关闭 iPhone 上的 HEIC [HEIC 图像技巧]

您是否正在为关闭 iPhone 上的 HEIC 而烦恼&#xff1f;你不是一个人; Apple 的首选图像文件格式仍可能存在一些兼容性问题。当您与某人共享照片或尝试在Windows计算机上打开图像时&#xff0c;就会出现此问题。幸运的是&#xff0c;Apple 使关闭 HEIC iPhone 变得更加容易。 …...

库伦值自动化功耗测试工具

1. 功能介绍 PlatformPower工具可以自动化测试不同场景的功耗电流&#xff0c;并可导出为excel文件便于测试结果分析查看。测试同时便于后续根据需求拓展其他自动化测试用例。 主要原理&#xff1a;基于文件节点 coulomb_count 实现&#xff0c;计算公式&#xff1a;电流&…...

[paddle] 非线性拟合问题的训练

利用paddlepaddle建立神经网络&#xff0c;模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ⁡ ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x)​ 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…...

Vue2: table加载树形数据的踩坑记录

table中需要加载树形数据,如图: 官网给了两个例子,且每个例子中的tree-props都是这么写的: :tree-props="{children: children, hasChildren: hasChildren}" 给我一种错觉,以为数据结构中要同时指定children和hasChildren字段,然而,在非懒加载模式下,数据结…...

全国计算机设计大赛大数据主题赛(和鲸赛道)经验分享

全国计算机设计大赛大数据主题赛&#xff08;和鲸赛道&#xff09;经验分享 这是“和鲸杯”辽宁省普通高等学校本科大学生计算机设计竞赛启动会汇报—大数据主题赛的文档总结。想要参加2025年此比赛的可以借鉴。 一、关于我 人工智能专业 计赛相关奖项&#xff1a; 2022年计…...

C# 设计模式(行为型模式):责任链模式

C# 设计模式&#xff08;行为型模式&#xff09;&#xff1a;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;用于让多个对象有机会处理同一个请求&#xff0c;避免请求发送者与接收者之间的耦合。它通过将请…...

人工智能之机器学习算法

所有的机器学习算法都是要优化的&#xff0c;优化的必要条件是确定优化的目标函数(损失函数)&#xff0c;目标函数是根据实际问题(数据)转成的数学公式。 一.线性回归原理推导 &#xff08;1&#xff09;回归问题概述 在机器学习的有监督算法中&#xff0c;分类与回归二种情…...

17爬虫:关于DrissionPage相关内容的学习01

概述 前面我们已经大致了解了selenium的用法&#xff0c;DerssionPage同selenium一样&#xff0c;也是一个基于Python的网页自动化工具。 DrissionPage既可以实现网页的自动化操作&#xff0c;也能够实现收发数据包&#xff0c;也可以把两者的功能合二为一。 DressionPage的…...

Ubuntu如何安装jdk并切换到不同的jdk版本

参考:https://www.cnblogs.com/Jakson/articles/4615768.html 摘要 &#xff1a;因为ubuntu 会自带open-jdk预装在系统内,当我们需要在 ubuntu下 安装jdk 的时候 ,发现 即使配置好环境变量后 输入 java -version 版本还是依然没有发生变化,我们需要以下2个步骤切换/usr/local/…...

Python基础语法(上)

目录 一、print函数及常量表达式 1.print函数 2.常量表达式 二、变量 1.定义变量的规则 2.python的动态类型特性 3.字符串 三、注释 四、input函数 1.input函数 2.变量类型转换 五、运算符 1.算数运算符 2.关系运算符 &#xff08;1&#xff09;整形的比较 &am…...

k8s系列--docker拉取镜像导入k8s的containerd中

# 确认一下当前集群中正在运行的 Pod 和命名空间 kubectl get pods -A# 示例一&#xff1a;拉取并导入 CoreDNS 镜像 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1 docker save registry.cn-hangzhou.aliyuncs.com/google_containers/cor…...

深入理解 Android 中的 ComponentInfo

深入理解 Android 中的 ComponentInfo 在 Android 开发中&#xff0c;ComponentInfo 是一个非常重要的类&#xff0c;它用于描述应用程序中的组件信息&#xff0c;包括 Activity、Service、BroadcastReceiver 和 ContentProvider。理解 ComponentInfo 的结构和使用方式&#x…...

阿里云 ECS 服务器绑定多个公网IP

阿里云 ECS 服务器绑定多个公网IP 一、弹性公网IP绑定ECS服务器 单台ECS一般只能直接绑定一个弹性公网IP&#xff0c;但是可以绑定多张弹性网卡&#xff0c;如果把弹性公网IP绑定到弹性网卡上&#xff0c;那么单台ECS就能间接绑定多个弹性公网IP。但有的服务器系统镜像可能不…...

模块化通讯管理机在物联网系统中的应用

安科瑞刘鸿鹏 摘要 随着能源结构转型和智能化电网的推进&#xff0c;电力物联网逐渐成为智能电网的重要组成部分。本文以安科瑞ANet系列智能通信管理机为例&#xff0c;探讨其在电力物联网中的应用&#xff0c;包括数据采集、规约转换、边缘计算、远程控制等技术实践&#…...

Kafka Offset explorer使用

Kafka集群配置好以后以后运维这边先用工具测试一下&#xff0c;便于rd展开后续的工作&#xff0c;本地调试时一般使用Offset explorer工具进行连接 使用SASL(Simple Authentication and Security Layer)验证方式 使用SCRAM-SHA-256(Salted Challenge Response Authentication…...

小程序学习07—— uniapp组件通信props和$emit和插槽语法

目录 一 父组件向子组件传递消息 1.1 props &#xff08;a&#xff09;传递静态或动态的 Prop &#xff08;b&#xff09;单向数据流 二 子组件通知父组件 2.1 $emit &#xff08;a&#xff09;定义自定义事件 &#xff08;b&#xff09;绑定自定义事件 三 插槽语法…...

行为模式1.模板方法模式

行为型模式 模板方法模式&#xff08;Template Method Pattern&#xff09;命令模式&#xff08;Command Pattern&#xff09;迭代器模式&#xff08;Iterator Pattern&#xff09;观察者模式&#xff08;Observer Pattern&#xff09;中介者模式&#xff08;Mediator Pattern…...

【模型】Qwen2-VL 服务端UI

1. 前言 最近在测试VLM模型&#xff0c;发现官方的网页demo&#xff0c;代码中视频与图片分辨率可能由于高并发设置的很小&#xff0c;导致达不到预期效果&#xff0c;于是自己研究了一下&#xff0c;搞了一个简单的前端部署&#xff0c;自己在服务器部署了下UI界面&#xff0…...

ImageNet 2.0?自动驾驶数据集迎来自动标注新时代

引言&#xff1a; 3DGS因其渲染速度快和高质量的新视角合成而备受关注。一些研究人员尝试将3DGS应用于驾驶场景的重建。然而&#xff0c;这些方法通常依赖于多种数据类型&#xff0c;如深度图、3D框和移动物体的轨迹。此外&#xff0c;合成图像缺乏标注也限制了其在下游任务中的…...

京东一面:MySQL 主备延迟有哪些坑?主备切换策略

作为一名开发同学&#xff0c;大家对 MySQL 一定不陌生&#xff0c;像常见的 事务特性、隔离级别 、索引等也都是老生常谈。 今天&#xff0c;我们就来聊个深度话题&#xff0c;关于 MySQL 的 高可用 一、什么是高可用&#xff1f; 维基百科定义&#xff1a; 高可用性&#x…...

Linux(Ubuntu24.04)安装Eigen3库

本次安装Eigen3是在WSL2的Ubuntu24.04环境下进行。 Eigen3是一个C模板库&#xff0c;用于线性代数、矩阵运算和数值计算。它提供了一组高性能的矩阵和向量操作&#xff0c;以及常用的线性代数算法&#xff0c;如矩阵分解、特征值求解和最小二乘解等。 1、安装Eigen3 有两种安…...

ABP框架8——仓储的作用及其基础Demo

一、使用仓储的好处 1.提高CRUD接口复用性2.解耦业务逻辑&#xff08;BLL&#xff09;和增删改查&#xff08;CRUD&#xff09;&#xff0c;换ORM特别方便&#xff0c;不需要改应用层&#xff0c;直接改仓储层3.做复杂查询4.事务支持 二、Demo public class BookRepository …...

【Multisim用74ls92和90做六十进制】2022-6-12

缘由Multisim如何用74ls92和90做六十进制-其他-CSDN问答 74LS92、74LS90参考...

利用KPaaS平台提升企业审批流程的透明度

企业的审批流程不仅影响决策效率&#xff0c;还直接关联到组织的透明度和运营效果。传统的审批流程通常由多个环节和系统构成&#xff0c;每一个环节都可能存在信息不对称的现象。例如&#xff0c;某一审批节点的负责人可能并不清楚当前的审批状态&#xff0c;而在其他环节&…...

Python 数据可视化的完整指南

目录 一、为什么选择 Python 进行数据可视化? 二、常用 Python 可视化库及其特点 三、常用图表类型及其代码示例 折线图:用于展示数据随时间或其他连续变量的变化趋势。 柱状图:用于比较不同类别的数据大小。 散点图:用于展示两个变量之间的关系,并发现数据中的模式…...

ZYNQ初识7(zynq_7010)RAM_IP核

学习汇总正点原子bi站教学视频。但由于目前的学习板PL端缺乏时钟晶振&#xff0c;所以需要从PS端调用时钟供给PL端使用&#xff0c;也就造成顶层文件的设置出现一些问题&#xff0c;在IP核创建调用和例化过程中一些功能会受到限制&#xff0c;所以以下仅作汇总参考。 zynq_7000…...

.e01, ..., .e0n的分卷压缩包怎么解压

用BandiZip&#xff0c;这些分卷压缩中还有一个.exe的文件&#xff0c;这个不是可执行文件&#xff0c;是一个解压缩的开头。 安装好bandiZip后&#xff0c;右键这个.exe文件 点击打开就是开始解压了&#xff1a; 最后解压后是这些。然后一个个再次解压....

linux网络管理

网络配置文件 网卡信息文件 :::color3 /etc/sysconfig/network-scripts ::: 配置描述DEVICE网卡设备名-必填BOOTPROTO必填&#xff1a;none,static(静态 IP),dhcp(动态 IP)HWADDRMAC 地址NM_CONTROLLED是否启用Network Manager图形管理工具&#xff0c;建议 noONBOOT是否默认…...

宽带、光猫、路由器、WiFi、光纤之间的关系

1、宽带&#xff08;Broadband&#xff09; 1.1 宽带的定义宽带指的是一种高速互联网接入技术&#xff0c;通常包括ADSL、光纤、4G/5G等不同类型的接入方式。宽带的关键特点是能够提供较高的数据传输速率&#xff0c;使得用户可以享受到稳定的上网体验。 1.2 宽带的作用宽带是…...

Momentum Contrast for Unsupervised Visual Representation Learning论文笔记

文章目录 论文地址动量队列对比学习的infoNCE loss为什么需要动量编码器对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同为什么动量编码器和梯度编码器不能完全相同&#xff1f;总结&#xff1a; 我理解&#xff0c;正负样本应该经过同一个encoder&#xff0c…...

linux-26 文件管理(四)install

说一个命令&#xff0c;叫install&#xff0c;man install&#xff0c;install是什么意思&#xff1f;安装&#xff0c;install表示安装的意思&#xff0c;那你猜install是用来干什么的&#xff1f;猜一猜干什么的&#xff1f;安装软件&#xff0c;安装第三方软件&#xff0c;错…...

day-104 组合总和 Ⅳ

思路 动态规划 解题过程 假设dfs(target)表示组成target的组合数&#xff0c;可得转换方程dfs(target)dfs(target-nums[0])dfs(target-nums[1])…以此类推 注意&#xff1a;nums[i]需要小于等于当前的target Code class Solution {public int combinationSum4(int[] nums, i…...