11.25c++继承、多态

练习:

cpp 复制代码
编写一个 武器类
class Weapon{
    int atk;
}

编写3个武器派生类:短剑,斧头,长剑
class knife{
    int spd;
}

class axe{
    int hp;
}

class sword{
    int def;
}

编写一个英雄类
class Hero{
    int atk;
    int def;
    int spd;
    int hp;
public:
    所有的get set 方法
    void equipWeapon(Weapon*)
    根据传入的武器不同,英雄获得不同的属性加成
}

代码实现:

cpp 复制代码
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <myhead.h>
using namespace std;  

class Weapon;
class Hero{
private:
	int atk;
	int def;
	int spd;
	int hp;
public:
	Hero(int atk=0,int def=0,int spd=0,int hp=0):spd(spd),hp(hp),def(def),atk(atk){}
	void setAtk(int atk){
		this->atk=atk;	
	}
	void setSpd(int spd){
		this->spd=spd;
	}
	void setHp(int hp){
		this->hp=hp;
	}
	void setDef(int def){
		this->def=def;
	}
	int getAtk(){
		return this->atk;
	}
	int getSpd(){
		return this->spd;
	}
	int getHp(){
		return this->hp;
	}
	int getDef(){
		return this->def;
	}
	void equipweapon(Weapon* w);
	void showProptery(){
		cout << "h p=" << hp << endl;
		cout << "spd=" << spd << endl;
		cout << "def=" << def << endl;
		cout << "atk=" << atk << endl;
		cout << "-------------" << endl;
	}
};
  
class Weapon{
private:
	int atk;
public:
	Weapon(int atk=0):atk(atk){}

	void setAtk(int atk){
		this->atk=atk;
	}
	int getAtk(){
		return this->atk;
	}
	virtual void addProptery(Hero& hero){}
};
class Knife:public Weapon{
private:
	int spd;
public:
	Knife(int atk=1,int spd=1):Weapon(atk),spd(spd){}
	void setSpd(int spd){
		this->spd=spd;
	}
	int getSpd(){
		return this->spd;
	}
	virtual void addProptery(Hero& hero){
		int atk=hero.getAtk()+this->getAtk();
		int spd=hero.getSpd()+this->spd;
		hero.setAtk(atk);
		hero.setSpd(spd);
	}
	
};
class Axe:public Weapon{
private:
	int hp;
public:
	Axe(int atk=1,int hp=1):Weapon(atk),hp(hp){}
	void setHp(int hp){
		this->hp=hp;
	}
	int getHp(){
		return this->hp;
	}
	virtual void addProptery(Hero& hero){
		int atk=hero.getAtk()+this->getAtk();
		int hp=hero.getHp()+this->hp;
		hero.setAtk(atk);
		hero.setHp(hp);
	}
};
class Sword:public Weapon{
private:
	int def;
public:
	Sword(int atk=1,int def=1):Weapon(atk),def(def){}
	void setDef(int def){
		this->def=def;
	}
	int getDef(){
		return this->def;
	}
	virtual void addProptery(Hero& hero){
		int atk=hero.getAtk()+this->getAtk();
		int def=hero.getDef()+this->def;
		hero.setAtk(atk);
		hero.setDef(def);
	}
};
void Hero::equipweapon(Weapon* w){
	w->addProptery(*this);
}

int main(int argc,const char **argv){
	Hero h1,h2,h3;
	Knife k;
	Sword s;
	Axe a;
	h1.equipweapon(&k);
	h2.equipweapon(&s);
	h3.equipweapon(&a);
	h1.showProptery();
	h2.showProptery();
	h3.showProptery();
	return 0;
}
相关推荐
柯南二号21 分钟前
【Java后端】MyBatis-Plus 原理解析
java·开发语言·mybatis
INS_KF26 分钟前
【C++知识杂记2】free和delete区别
c++·笔记·学习
一只鱼^_34 分钟前
牛客周赛 Round 105
数据结构·c++·算法·均值算法·逻辑回归·动态规划·启发式算法
ikkkkkkkl36 分钟前
C++设计模式:面向对象设计原则
c++·设计模式·面向对象
我是哈哈hh41 分钟前
【Node.js】ECMAScript标准 以及 npm安装
开发语言·前端·javascript·node.js
啊阿狸不会拉杆1 小时前
《算法导论》第 27 章 - 多线程算法
java·jvm·c++·算法·图论
重启的码农1 小时前
ggml介绍 (8) 图分配器 (ggml_gallocr)
c++·人工智能·神经网络
重启的码农1 小时前
ggml介绍 (9) 后端调度器 (ggml_backend_sched)
c++·人工智能·神经网络
Sammyyyyy2 小时前
2025年,Javascript后端应该用 Bun、Node.js 还是 Deno?
开发语言·javascript·node.js
汉汉汉汉汉3 小时前
C++11新特性详解:从列表初始化到线程库
c++