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

02.25 继承和多态

编写一个如下场景:
有一个英雄Hero类,私有成员,攻击,防御,速度,生命值,以及所有的set get 方法
编写一个 武器 Weapon 类,拥有私有成员攻击力,以及set get 方法
编写一个 长剑 Sword 类,继承自武器类,拓展属性 生命值,以及set get 方法
编写一个 匕首Blade类,继承自武器类,拓展属性 速度,以及set get 方法
编写一个 斧头 Axe类,继承自武器类,拓展属性 防御力,以及set get 方法

武器Weapon类里面,要求有一个多态函数,叫做 equip 函数
英雄Hero类里面,要求有一个公开函数,equipWeapon(Weapon* w)
实现功能:英雄既可以装备长剑,也可以装备短剑,也可以装备斧头,但是要求装备不同的武器,英雄需要获得不同的属性加成

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>

using namespace std;

class Hero;

// 武器基类
class Weapon {
private:
    int attack;
public:
    void setAttack(int val) { attack = val; }
    int getAttack() { return attack; }

    // 多态函数,装备武器时的行为
    virtual void equip(Hero* hero) = 0;
};

// 英雄类
class Hero {
private:
    int attack;
    int defense;
    int speed;
    int life;
public:
    void setAttack(int val) { attack = val; }
    void setDefense(int val) { defense = val; }
    void setSpeed(int val) { speed = val; }
    void setLife(int val) { life = val; }

    int getAttack() { return attack; }
    int getDefense() { return defense; }
    int getSpeed() { return speed; }
    int getLife() { return life; }

    // 装备武器函数
    void equipWeapon(Weapon* w) {
        w->equip(this); // 调用武器的equip函数,传入当前英雄对象
    }

    // 打印英雄属性
    void printStats() {
        cout << "英雄属性: " << endl;
        cout << "攻击值: " << attack << endl;
        cout << "防御值: " << defense << endl;
        cout << "速度值: " << speed << endl;
        cout << "生命值: " << life << endl;
    }
};

// 长剑类,继承自武器类
class Sword : public Weapon {
private:
    int lifeBonus; // 生命值加成
public:
    Sword(int attack, int lifeBonus) {
        setAttack(attack);
        this->lifeBonus = lifeBonus;
    }

    void setLifeBonus(int val) { lifeBonus = val; }
    int getLifeBonus() { return lifeBonus; }

    // 实现equip函数,装备长剑时增加英雄的攻击力和生命值
    void equip(Hero* hero) override {
        hero->setAttack(hero->getAttack() + getAttack());
        hero->setLife(hero->getLife() + lifeBonus);
    }
};

// 匕首类,继承自武器类
class Blade : public Weapon {
private:
    int speedBonus; // 速度加成
public:
    Blade(int attack, int speedBonus) {
        setAttack(attack);
        this->speedBonus = speedBonus;
    }

    void setSpeedBonus(int val) { speedBonus = val; }
    int getSpeedBonus() { return speedBonus; }

    // 实现equip函数,装备匕首时增加英雄的攻击力和速度
    void equip(Hero* hero) override {
        hero->setAttack(hero->getAttack() + getAttack());
        hero->setSpeed(hero->getSpeed() + speedBonus);
    }
};

// 斧头类,继承自武器类
class Axe : public Weapon {
private:
    int defenseBonus; // 防御力加成
public:
    Axe(int attack, int defenseBonus) {
        setAttack(attack);
        this->defenseBonus = defenseBonus;
    }

    void setDefenseBonus(int val) { defenseBonus = val; }
    int getDefenseBonus() { return defenseBonus; }

    // 实现equip函数,装备斧头时增加英雄的攻击力和防御力
    void equip(Hero* hero) override {
        hero->setAttack(hero->getAttack() + getAttack());
        hero->setDefense(hero->getDefense() + defenseBonus);
    }
};

int main(int argc, const char** argv) {
    // 创建一个英雄
    Hero hero;
    hero.setAttack(10);
    hero.setDefense(5);
    hero.setSpeed(8);
    hero.setLife(100);

    // 打印初始属性
    cout << "初始化英雄属性:" << endl;
    hero.printStats();

    // 创建不同的武器
    Sword sword(15, 20); // 长剑,攻击力+15,生命值+20
    Blade blade(10, 5);  // 匕首,攻击力+10,速度+5
    Axe axe(20, 10);     // 斧头,攻击力+20,防御力+10

    // 装备长剑
    hero.equipWeapon(&sword);
    cout << endl << "装备长剑后:" << endl;
    hero.printStats();

    // 装备匕首
    hero.equipWeapon(&blade);
    cout << endl << "装备匕首之后:" << endl;
    hero.printStats();

    // 装备斧头
    hero.equipWeapon(&axe);
    cout << endl << "装备斧头之后:" << endl;
    hero.printStats();

    return 0;
}

运行结果:

http://www.dtcms.com/a/36670.html

相关文章:

  • 【大模型系列】使用ollama本地运行千问2.5模型
  • [字节青训_AI对话框]SSE交互规范、自定义事件、前后端数据传递、状态监听、连接和断开详解
  • knife4j+springboot3.4异常无法正确展示文档
  • (论文)使用双频分析检测 AI 合成的语音
  • 【大厂AI实践】微软:基于预训练的自然语言生成在搜索与广告中的应用
  • 高一英语拓展词汇第二版
  • 基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析实践应用
  • Android构建系统 - 03 编译执行流程
  • Zemax OpticStudio 中的扩散器建模
  • Linux网络安全
  • 如何利用机器学习实现信用风险评分
  • 深度剖析Seata源码:解锁分布式事务处理的核心逻辑
  • 一文掌握 Playwright 的详细使用
  • C++核心指导原则: 表达式和语句
  • AI赋能:使用AI代码生成器提升前端可访问性
  • 2024最新版鸿蒙纯血原生应用开发教程文档丨学习ArkTS语言-基本语法
  • glb模型压缩draco使用教程windows
  • 全方位监控AWS Application Load Balancer异常情况实战
  • LeetCodeHot100_0x02
  • 基于Grok3+NebulaGraph构建省市区乡镇街道知识图谱
  • 复杂提示工程:Chain-of-Thought vs Tree-of-Thought 范式对比
  • 可重入(Reentrant)与可重入锁(Reentrant Lock)详解
  • Unity百游修炼(2)——Brick_Breaker详细制作全流程
  • kotlin 知识点一 变量和函数
  • 蓝桥杯好题推荐--多项式输出
  • Python Flask基于时间序列预测算法的智慧交通数据可视化分析系统【附源码】
  • 【算法系列】常见排序算法:冒泡排序、选择排序与插入排序
  • Unity自定义树(Tree)
  • 城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章
  • 【无标题】网络安全公钥密码体制