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);
而添加雷鸟类只需添加它一类,并不需要修改其他;
明日计划:继续学习多态;