尝试应用多态

多态是真的好用啊,虚函数的调用使得每个类有了更好的封装性
这次尝试了郭炜老师教材上的一个简单的多态的实例
有些感悟:
多态的语句调用哪个类的成员函数是在运行的时候才能确定的,编译时不能确定。
因此,对于不同类中的同名虚函数,如调用时都使用了基类对象指针,则在基类中也需要写这些虚函数(虽然并不会被调用),因为编译时并不能确定调用的其实是派生类的虚函数。运行时才能确定。

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值