061day(虚函数和多态)

本文介绍了C++中虚函数的概念及其使用方法,并通过多态的特性实现了游戏中的怪物类之间的交互,展示了如何通过虚函数简化代码并提高扩展性。

172210704111-陈国佳总结《2017年12月10日 》【连续061天】

标题:虚函数和多态;

内容:

A.虚函数:

class base{ virtual int get();
};  int base::get(){  }

在类定义中,前有virtual的成员函数就是虚函数(写函数体时不必加);

B.多态:

1.派生类的指针可以赋给基类指针;

通过基类指针调用基类和派生类中的同名虚函数时:

1)该指针指向一个基类对象,调用基类虚函数;

2)指向派生类对象,调用派生类虚函数;

class CBase{
public:
virtual void SomeVirtualFunction(){cout<<"ABC"<<endl;}
};
class CDerived:public CBase{
public:
virtual void SomeVirtualFunction(){cout<<"abc"<<endl;}
};
int main(){
CDerived ODerived;
CBase*p=& ODerived;
p->SomeVirtualFunction();
return 0;
}

2.派生类的对象可以赋给基类引用;

通过基类引用调用基类和派生类中的同名虚函数时:
1)若该引用引用的是一个基类的对象,调用基类的虚函数;

2)引用派生类对象,调用派生类的虚函数;

int main(){
CDerived ODerived;
CBase&r=ODerived;
r.SomeVirtualFunction();
return 0;
}



C.多态实例:

以某游戏为例,假设游戏中,每种怪物有一个类与之对应,每个怪物就是一个对象。

怪物之间通过成员函数实现互相攻击,攻击敌人和被攻击时的动作。

先增加一种怪物雷鸟 CThunderBird

Attack(攻击),FightBack(反击),Hurted(受伤)

非多态实现:

class CCreature{
protected: int nPower;  //攻击力
          int nLifeValue;  //生命值 
};
class CDragon:public CCreature{   //龙类 
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);
}
//.......
}; 

这样,有n种怪物,CDragon类就有n个Attack函数,n个FightBack;

其它也是如此,如果加入一个怪物,就需要非常大的改动;


多态实现:

class CCreature{
protected:
int m_nLifeValue,m_nPower;
    public:
    virtual void Attack(CCreature*pCreature){}
    virtual void Hurted(int nPower){}
    virtual void FightBack(CCreature*pCreature){}
};
class CDragon:public CCreature{
public:
virtual void Attack(CCreature*pCreature);
virtual void Hurted(int nPower);
virtual void FightBack(CCreature*pCreature);
};
void CDron::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);
}

这样我们在主程序中只需:

CDragon Dragon;
CWolf Wolf;
CGhost Ghost;
CThunderBird Bird;
Dragon.Attack(&Wolf);
Dragon.Attack(&Ghost);
Dragon.Attack(&Bird);

而添加雷鸟类只需添加它一类,并不需要修改其他;


明日计划:继续学习多态;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值