中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第六周 多态 笔记 之 多态实例:魔法门之英雄无敌

第六周 多态
1.虚函数和多态的基本概念
2.多态实例:魔法门之英雄无敌
3.更多多态程序实例
4.多态的实现原理
5.虚析构函数、纯虚函数和抽象类

2.多态实例:魔法门之英雄无敌

游戏中有很多种怪物,每种怪物都有一个类与之对应,每个怪物就是一个对象。假设现在有五种怪物,也就是现有五个类:CSoldier,CDragon,Cwolf,CPhonex,CAngel。怪物能够互相攻击,攻击敌人和被攻击时都有相应的动作,动作是通过对象的成员函数实现的。游戏版本升级时,要增加新的怪物–雷鸟类CThunderBird。如何编程才能使升级时的代码改动和增加量较小?

基本思路:

为每个怪物类编写 Attack、FightBack和 Hurted成员函数。
Attact函数表现攻击动作,攻击某个怪物,并调用被攻击怪物的Hurted函数,以减少被攻击怪物的生命值,同时也调用被攻击怪物的 FightBack成员函数,遭受被攻击怪物反击。
Hurted函数减少自身生命值,并表现受伤动作。
FightBack成员函数表现反击动作,并调用被反击对象的Hurted成员函数,使被反击对象受伤。
设置基类 CCreature,并且使CDragon, CWolf等其他类都从CCreature派生而来。
中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第六周 多态 笔记 之 多态实例:魔法门之英雄无敌_第1张图片

非多态的实现方法

class class CCreature {
	protected:  
		int nPower ; //代表攻击力
		int nLifeValue ; //代表生命值
};
class CDragon:public CCreature {
	public:
		void Attack(CWolf * pWolf) {
			//表现攻击动作的代码
			pWolf->Hurted( nPower);
			pWolf->FightBack( this);
		}
		void Attack( CGhost * pGhost) {
			//表现攻击动作的代码
			pGhost->Hurted( nPower);
			pGohst->FightBack( this);
		}
		void Hurted ( int nPower) {
			//表现受伤动作的代码
			nLifeValue -= nPower;
		}
		void FightBack( CWolf * pWolf) {
			//表现反击动作的代码
			pWolf ->Hurted( nPower / 2);
		}
		void FightBack( CGhost * pGhost) {
			//表现反击动作的代码
			pGhost->Hurted( nPower / 2 );
		}
}

有n种怪物,CDragon 类中就会有n个 Attack 成员函数,以及 n个FightBack成员函数。对于其他类也如此。
缺点: 如果游戏版本升级,增加了新的怪物雷鸟 CThunderBird,则程序改动较大。所有的类都需要增加两个成员函数:
void Attack( CThunderBird * pThunderBird)和void FightBack( CThunderBird * pThunderBird) ,工作量极大。

多态的实现方法

//基类 CCreature:
class CCreature {
	protected :
		int m_nLifeValue, m_nPower;
	public:
		virtual void Attack( CCreature * pCreature) {}
		virtual void Hurted( int nPower) { }
		virtual void FightBack( CCreature * pCreature) { }
};

基类只有一个 Attack 成员函数;也只有一个 FightBack成员函数;所有CCreature 的派生类也是这样。

// 以派生类 CDragon为例
class CDragon : public CCreature {
	public:
		virtual void Attack( CCreature * pCreature);
		virtual void Hurted( int nPower);
		virtual void FightBack( CCreature * pCreature);
};
void CDragon::Attack(CCreature * p)
{ 
	//表现攻击动作的代码
	p->Hurted(m_nPower); //多态
	p->FightBack(this); //多态
}
void CDragon::Hurted( int nPower)
{ 
	//表现受伤动作的代码
	m_nLifeValue -= nPower;
}
void CDragon::FightBack(CCreature * p)
{
	//表现反击动作的代码
	p->Hurted(m_nPower/2); //多态
}  

优势:如果游戏版本升级,增加了新的怪物雷鸟 CThunderBird,只需要编写新类CThunderBird, 不需要在已有的类里专
门为新怪物增加void Attack( CThunderBird * pThunderBird) 和void FightBack( CThunderBird * pThunderBird) ,成员函数,已有的类可以原封不动。

原理

CDragon Dragon; CWolf Wolf; CGhost Ghost;
CThunderBird Bird;
Dragon.Attack( & Wolf);  //(1)
Dragon.Attack( & Ghost); //(2)
Dragon.Attack( & Bird); //(3)

根据多态的规则,上面的(1),(2),(3)进入到CDragon::Attack函数后,能分别调用:

CWolf::Hurted
CGhost::Hurted
CBird::Hurted
void CDragon::Attack(CCreature * p)
{
	p->Hurted(m_nPower); //多态
	p->FightBack(this); //多态
}

你可能感兴趣的:(中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第六周 多态 笔记 之 多态实例:魔法门之英雄无敌)