C++中的多态和模板








#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>using namespace std;// 武器基类
class Weapon {
public:virtual ~Weapon() {}virtual string getName() const = 0; // 获取武器名称virtual int getAtk() const = 0; // 获取武器攻击力
};// 具体武器类
class Sword : public Weapon {
public:string getName() const override { return "Sword"; }int getAtk() const override { return 10; }
};class Blade : public Weapon {
public:string getName() const override { return "Blade"; }int getAtk() const override { return 7; }
};class Axe : public Weapon {
public:string getName() const override { return "Axe"; }int getAtk() const override { return 15; }
};
// 英雄类
class Hero {
public:enum class Profession { Warrior, Archer, Mage };Hero(Profession profession) : profession(profession) {}// 获取英雄职业Profession getProfession() const { return profession; }private:Profession profession;
};
class Monster {
public:Monster() {// 初始化随机种子srand(static_cast<unsigned int>(time(0)));}// 怪物死亡时掉落武器Weapon* die(const Hero& hero) {cout << "Monster died!" << endl;// 根据英雄职业或随机规则决定掉落武器Weapon* droppedWeapon = dropWeapon(hero);cout << "Dropped weapon: " << droppedWeapon->getName() << endreturn droppedWeapon;}private:// 根据英雄职业或随机掉落武器Weapon* dropWeapon(const Hero& hero) {if (hero.getProfession() == Hero::Profession::Warrior) {return new Axe(); // 战士掉落斧头} else if (hero.getProfession() == Hero::Profession::Archer) return new Sword(); // 弓箭手掉落长剑} else if (hero.getProfession() == Hero::Profession::Mage) {return new Blade(); // 法师掉落短剑}// 如果是其他职业,随机掉落武器int randChoice = rand() % 3;if (randChoice == 0) {return new Sword();} else if (randChoice == 1) {return new Blade();} else {return new Axe();}}
};
int main() {// 创建不同职业的英雄Hero warrior(Hero::Profession::Warrior);Hero archer(Hero::Profession::Archer);Hero mage(Hero::Profession::Mage);// 创建怪物Monster monster;// 模拟怪物死亡并掉落武器Weapon* weapon1 = monster.die(warrior); // 战士掉落斧头Weapon* weapon2 = monster.die(archer); // 弓箭手掉落长剑Weapon* weapon3 = monster.die(mage); // 法师掉落短剑// 删除掉落的武器,防止内存泄漏 delete weapon1;delete weapon2;delete weapon3;return 0;
}
#include <iostream>
using namespace std;template <typename T>
class List {
public:struct Node {T val;Node* next;Node* prev;};// 构造函数List() : head(nullptr), tail(nullptr) {}// 析构函数~List() {clear();}// 向链表末尾添加元素void push_back(const T& value) {Node* newNode = new Node{value, nullptr, tail}; // 创建新节点if (tail) {tail->next = newNode; // 如果链表非空,将新的节点连接到尾节}tail = newNode; // 更新尾节点if (!head) {head = newNode; // 如果链表为空,更新头节点}}// 访问链表中指定位置的元素T& operator[](size_t index) {Node* current = head;size_t count = 0;while (current && count < index) {current = current->next;count++;}if (current) {return current->val;}throw out_of_range("Index out of range");}// 打印链表内容friend ostream& operator<<(ostream& os, const List<T>& list) {Node* current = list.head;while (current) {os << current->val << " ";current = current->next;}return os;}// 清除链表void clear() {Node* current = head;while (current) {Node* nextNode = current->next;delete current; // 删除当前节点current = nextNode; // 移动到下一个节点}head = tail = nullptr; // 头尾指针置空}private:Node* head; // 链表头Node* tail; // 链表尾
};int main() {List<int> myList;myList.push_back(10);myList.push_back(20);myList.push_back(30);cout << "链表内容: " << myList << endl;cout << "访问索引1的元素: " << myList[1] << endl;return 0;
}
相关文章:
C++中的多态和模板
#include <iostream> #include <cstdlib> #include <ctime> #include <string>using namespace std;// 武器基类 class Weapon { public:virtual ~Weapon() {}virtual string getName() const 0; // 获取武器名称virtual int getAtk() const 0; …...
Java 类型转换和泛型原理(JVM 层面)
一、类型转换 概念解释: 编译类型:在编译时确定,保存在虚拟机栈的栈帧中的局部变量表中; 运行类型:在运行时确定,由保存在局部变量表中变量指向的堆中对象实例的类型决定(存储在对象头中&…...
Wireshark 安装保姆教程(图文详解)
一、Wireshark 简介 Wireshark是使用最广泛的一款开源抓包软件,常用来检测网络问题、攻击溯源、或者分析底层通信机制。它使用WinPCAP作为接口,直接与网卡进行数据报文交换,它支持在 Windows、Mac OS、Linux 等多种主流操作系统上运行 &…...
下载安装Node.js及其他环境
提示:从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm(我需要安装)安装脚手架安装依赖安装淘宝镜像(注意会更新)cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…...
机器视觉3D中激光偏镜的优点
机器视觉的3D应用中,激光偏镜(如偏振片、波片、偏振分束器等)通过其独特的偏振控制能力,显著提升了系统的测量精度、抗干扰能力和适应性。以下是其核心优点: 1. 提升3D成像精度 抑制环境光干扰:偏振片可滤除非偏振的环境杂光(如日光、室内照明),仅保留激光偏振信号,大…...
MyBatis Plus 在 ZKmall开源商城持久层的优化实践
ZKmall开源商城作为基于 Spring Cloud 的高性能电商平台,其持久层通过 MyBatis Plus 实现了多项深度优化,涵盖分库分表、缓存策略、分页性能、多租户隔离等核心场景。以下是具体实践总结: 一、分库分表与插件集成优化 1. 分库分表策略 Sh…...
rust 同时处理多个异步任务,并在一个任务完成退出
use std::thread; use tokio::{sync::mpsc,time::{sleep, Duration}, };async fn check_for_one() {// 该函数会每秒打印一次 "write"loop {println!("write");sleep(Duration::from_secs(1)).await;} }async fn start_print_task() -> Result<(), (…...
使用注解开发springMVC
引言 在学习过第一个springMVC项目建造过后,让我们直接进入真实开发中所必需的注解开发, 是何等的简洁高效!! 注:由于Maven可能存在资源过滤的问题,在maven依赖中加入 <build><resources>&l…...
深入解析 Java 8 Function 接口:函数式编程的核心工具
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Java 8 引入的 java.util.function.Function 接口是函数式编程范式的核心组件之一,本文将全面解析其使用方法,并通过丰富的代码示例演…...
【Axure元件分享】时间范围选择器
时间范围选择器下拉选择开始时间和结束时间,实现效果如下。 源文件截图: 元件获取方式:...
【Linux操作系统——学习笔记三】Linux环境下多级目录构建与管理的命令行实践报告
1.在用户主目录下,使用以下方法新建目录,并显示详细执行过程: (1)使用绝对路径在当前目录下创建 new_dir目录 (2)使用相对路径、在当前目录创建dir1、dir2、dir3目录 (3)…...
Mysql 中的两阶段提交
MySQL 中的“两阶段提交”(Two-Phase Commit,2PC)是用于分布式事务中的一种协议,目的是保证在多个数据库节点之间操作的一致性。虽然 MySQL 自身并不是分布式数据库,但在 使用 InnoDB 引擎和 binlog 的情况下ÿ…...
Scade One - 将MBD技术从少数高安全领域向更广泛的安全嵌入式软件普及
Scade One是继Scade Suite version 6自2008年起发展近20年后的首次主要改进版本。在Scade One发布的同时,Scade团队发布了一系列介绍Scade One的博客。本篇Scade One - Democratizing model-based development是其中的一部分。在后面的内容中,将复述博客…...
C# 与 相机连接
一、通过组件连接相机 需要提前在VisionPro里面保存一个CogAcqFifoTool相机工具为 .vpp 定义一个相机工具 CogAcqFifoTool mAcq null;将保存的相机工具放入mAcq中 string path “C:\Acq.vpp”; mAcq (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);给窗口相机…...
JAVA学习小记之IO流04--转换流篇
转换流: 按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。 转换的原因是: 有的文件并非是按UTF-8编码,那么在读文件内容…...
SH 和 BASH 有什么不同 ?
当谈到 shell 脚本编写时,经常出现两个突出的 shell,Bourne shell (SH) 和 Bourne Again shell (Bash)。两者都是基于 unix 和 linux 的系统的组成部分,提供与操作系统交互的接口。本文旨在深入研究这两种 shell 之间的复杂差异,揭…...
linux专题3-----linux上链接远程mysql
要在 Ubuntu 上连接远程 MySQL 数据库,你可以使用 MySQL 客户端工具或者其他数据库管理工具,如 phpMyAdmin 或 MySQL Workbench。以下是使用 MySQL 命令行工具连接远程 MySQL 的步骤: 确保已安装 MySQL 客户端 首先,确保你的 Ub…...
Qt 音乐播放器项目
具体代码见:https://gitee.com/Suinnnnnn/MusicPlayer 文章目录 0. 预备1. 界面1.1 各部位长度1.2 ui文件1.3 窗口前置设置1.4 设置QSS 2. 自定义控件2.1 按钮2.2 推荐页面2.3 CommonPage2.4 滑杆 3. 音乐管理4. 歌词界面4.1 ui文件4.2 LrcPage.h文件 5. 音乐播放控…...
类似于langchain的开发框架有哪些?
类似于 LangChain 的开发框架主要用于构建基于大语言模型(LLM)的应用程序,提供链式调用、工具集成、记忆管理等功能。以下是一些类似的框架和工具: 1. LlamaIndex(原GPT Index) 特点:专注于文档…...
IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置与实战指南
前言 Spring Boot 3.4.x作为当前最新稳定版本,全面支持Java 17与Jakarta EE 10规范。本文以Spring Boot 3.4.1和Redis 7.x为例,详解如何在IDEA中快速接入Redis,涵盖最新依赖配置、数据序列化优化、缓存注解及高…...
【mongodb】MongoDB的应用场景
目录 1.说明2.内容管理系统(CMS)2.1 场景描述2.2 MongoDB优势2.3 示例 3.实时分析与大数据3.1 场景描述3.2 MongoDB优势3.3 示例 4.移动应用后端4.1 场景描述4.2 MongoDB优势4.3 示例 5.游戏开发5.1 场景描述5.2 MongoDB优势5.3 示例 6.电子商务平台6.1 …...
.NET用C#在PDF文档中添加、删除和替换图片
在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一。通过C#在.NET平台实现图片的添加、替换和删除功能,不仅能显著提升PDF文档的视觉表现力与信息承载效率,更可满足数据动态更新、内容精准维护等复杂业…...
Linux文件操作命令详解
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 在Linux操作系统中,文件操作命令是用户与系统交互的重要工具。掌握这些命令能够高效地管理文件和目录。本文将详细介绍常用的Linux文件操作命令,包括它们的用法、选项、具体示例及运行结果。 1. 查看文…...
anaconda安装使用+pytorch环境配置(cpu)+pycharm环境配置(详细教程)
一、anaconda下载 1.anaconda官网尝试下载: 官网网址:Anaconda | Built to Advance Open Source AI 1.进入官网 2.点击Products->Distribution,跳过注册进入下载页面 3.选择系统下载 2.清华镜像下载 1.网址:Index of /anac…...
c++STL入门
目录 什么是STL? vector容器 构造函数 赋值操作 vector容量和大小 vector存放内置数据类型 vector存放自定义数据类型 存放指针 vector容器嵌套容器 string容器 构造函数 赋值操作 字符串拼接 查找和替换 string字符串比较 string字符存取 string插…...
electron-update + nginx热更新
1.安装"electron-updater": “^6.6.2”, npm i electron-updater2.创建checkUpdate.js // 引入自动更新 const {autoUpdater} require(electron-updater); const { dialog } require(electron); // 自动更新检查 export function checkForUpdates() {// 检查新版…...
SpringMVC与SpringCloud的区别
SpringMVC与SpringCloud的核心区别 功能定位 • SpringMVC: 基于Spring框架的Web层开发模块,采用MVC(Model-View-Controller)模式,专注于处理HTTP请求、路由分发(如DispatcherServlet)和视图…...
【动态规划】P8638 [蓝桥杯 2016 省 A] 密码脱落
题解:P8638 [蓝桥杯 2016 省 A] 密码脱落 题目传送门:P8638 密码脱落 一、题目描述 考古学家发现了一些由 A、B、C、D 四种种子组成的密码串,这些串原本是回文串(前后对称),但由于部分种子脱落ÿ…...
PyTorch池化层详解:原理、实现与示例
池化层(Pooling Layer)是卷积神经网络中的重要组成部分,主要用于降低特征图的空间维度、减少计算量并增强模型的平移不变性。本文将通过PyTorch代码演示池化层的实现原理,并详细讲解最大池化、平均池化、填充(Padding&…...
前端知识点---本地存储(javascript)
localStorage 是浏览器提供的一个 本地存储 API,可以在用户的浏览器中存储数据,数据不会随页面刷新而丢失。 1. 基本用法 (1) 存储数据(setItem) localStorage.setItem("username", "zhangsan");存储 “use…...
