背景
基本思路
非多态实现方法
非多态实现方法的缺点
改进方法
每增加一个新的类,则要增加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: 500HP: 1000 Power: 300HP: 500 Power: 200*/
多态实现方法的优势
如果增加新的怪物(新的类),不需要在已有的类里新增加作用于新怪物的成员函数,已有的类可以原封不动,只需要编写新类即可,极大地减少工作量,提高效率。




