背景
基本思路
非多态实现方法
非多态实现方法的缺点
改进方法
每增加一个新的类,则要增加2n个成员函数,即使已有的类中也是一大堆成员函数,然而这么多成员函数,唯一不一样的地方仅仅是作用的类不同,而这些类都派生自同一个基类。
根据公有派生的赋值兼容规则以及多态的基本概念,用多态实现可以大大减少初始代码量以及改动时所增加的代码量。
多态实现方法
#include <bits/stdc++.h>
using namespace std;
class creature //基类各类成员函数就一个,其他所有派生类亦如此
{
protected:
int HP;
int power;
public:
creature(int x, int y) : HP(x), power(y) {}
virtual void attack(creature &obj);
virtual void hurt(int damage);
virtual void fight_back(creature &obj);
void print(void) { cout << "HP: " << HP << " "
<< "Power: " << power << endl; }
};
void creature::attack(creature &obj)
{
obj.hurt(this->power); //多态,obj所属类由传入的参数决定,理论上可以是所有派生类
obj.fight_back(*this); //多态
}
void creature::hurt(int damage) { HP -= damage; } //多态
void creature::fight_back(creature &obj) { obj.HP -= this->power / 2; } //多态
//Dividing Line----------------------------------------------------------------------------------------------
class dragon : public creature //继承所有基类的虚函数
{
public:
dragon(int x, int y) : creature(x, y) {}
};
class ghost : public creature //继承所有基类的虚函数
{
public:
ghost(int x, int y) : creature(x, y) {}
};
class soldier : public creature //继承所有基类的虚函数
{
public:
soldier(int x, int y) : creature(x, y) {}
};
//Dividing Line---------------------------------------------------------------------------------------------
int main(void)
{
dragon Dra(3000, 500);
ghost Gho(1500, 300);
soldier Sol(1000, 200);
Dra.attack(Gho); //根据多态和虚函数的概念,这里调用Ghost::hurt()和Ghost::fight_back()
Dra.attack(Sol); //根据多态和虚函数的概念,这里调用Soldier::hurt()和Soldier::fight_back()
Dra.print();
Gho.print();
Sol.print();
return 0;
}
/*
HP: 2750 Power: 500
HP: 1000 Power: 300
HP: 500 Power: 200
*/
多态实现方法的优势
如果增加新的怪物(新的类),不需要在已有的类里新增加作用于新怪物的成员函数,已有的类可以原封不动,只需要编写新类即可,极大地减少工作量,提高效率。