多态是真的好用啊,虚函数的调用使得每个类有了更好的封装性
这次尝试了郭炜老师教材上的一个简单的多态的实例
有些感悟:
多态的语句调用哪个类的成员函数是在运行的时候才能确定的,编译时不能确定。
因此,对于不同类中的同名虚函数,如调用时都使用了基类对象指针,则在基类中也需要写这些虚函数(虽然并不会被调用),因为编译时并不能确定调用的其实是派生类的虚函数。运行时才能确定。
#include <iostream>
using namespace std;
class CCreature
{
protected:
int life,power;
public:
virtual void Attack(CCreature * pCreatur){};//这块必须有啊,否则后面显示CCreature没有Hurted成员
virtual void Hurted(int Power){};
virtual void FightBack(CCreature * pCreature){};
int getlife(){
return life;
}
};
class CDragon:public CCreature
{
public:
CDragon(int life_=100,int power_=8){
life=life_;
power=power_;
}
virtual void Attack(CCreature * pCreature);
virtual void Hurted(int Power);
virtual void FightBack(CCreature * pCreature);
};
void CDragon:: Attack(CCreature*p)
{
//表示攻击动作的代码
p->Hurted(power);
p->FightBack(this);
}
void CDragon :: Hurted(int power){
//表示受伤动作的代码
life-=power;
}
void CDragon:: FightBack(CCreature * p)
{
//表示反击动作的代码
p->Hurted(power/2);
}
class CAngel:public CCreature
{
public:
CAngel(int life_=75,int power_=10){
life=life_;
power=power_;
}
virtual void Attack(CCreature * pCreature);
virtual void Hurted(int Power);
virtual void FightBack(CCreature * pCreature);
};
void CAngel:: Attack(CCreature*p)
{
//表示攻击动作的代码
p->Hurted(1.2*power);
p->FightBack(this);
}
void CAngel :: Hurted(int power){
//表示受伤动作的代码
life-=0.5*power;
}
void CAngel:: FightBack(CCreature * p)
{
//表示反击动作的代码
p->Hurted(power/3);
}
int main()
{
CDragon D;
CAngel A;
A.Attack(&D);
D.Attack(&A);
cout<<"Dragonlife = "<<D.getlife()<<endl;
cout<<"Angellife = "<<A.getlife()<<endl;
system("pause");
return 0;
}