2017C++基础——网课笔记(89到91)

八十九. 多态的定义和多态的三个必要条件


#include <iostream>
#include <string>
using namespace std;

//岳不群
class Yuebuqun
{
public:
    Yuebuqun(string kongfu)
    {
        this->kongfu = kongfu;
    }

    virtual void fight()//virtual 表示,修饰一个成员方法是虚函数
    {
        cout<<"岳不群"<<"使出了"<<this->kongfu<<"打人"<<endl;
    }

    string kongfu;
};

//林平之
class Linpinzhi: public Yuebuqun
{
public:
    Linpinzhi(string kongfu):Yuebuqun(kongfu)
    {

    }

    //如果说父类有一个虚函数是fight(),子类如果去重写这个虚函数
    //那么父类指针指向父类or子类的时候,就会有不同的情况(多态)
    void fight()
    {
        cout<<"林平之"<<"使出了"<<kongfu<<"打人"<<endl;
    }

};

//在全局提供一个打斗的方法
void fightPeople(Yuebuqun *hero)
{
    cout<<"调用打人的方法"<<endl;
    hero->fight();//希望传递进来的如果是子类,调用子类的fight
                    //如果传进来的时父类,调用父类的fight
                    //这种行为就是多态行为
}
//多态发生的三个必要条件:
//1.必须要有继承
//2.必须要有虚函数的重写
//3.父类指针或引用,指向子类对象。


int main()
{
    Yuebuqun *y = new Yuebuqun("葵花宝典");
    y->fight();

    Linpinzhi *l = new Linpinzhi("僻邪剑谱");
    l->fight();
    cout<<"------------------"<<endl;
    //如果不在父类里给fight()方法加virtual,那么结果都是岳不群。。
    fightPeople(y);
    fightPeople(l);
    //编译器在这里,默认做了一个安全的处理。
    //编译器认为,不管传递的是子类对象还是父类对象
    //如果统一执行父类的方法,则一定是可以执行的

    delete y;
    delete l;
    return 0;
}

九十. 多态的意义


#include <iostream>


using namespace std;


//英雄类
class Hero
{
public:
    virtual int getAd(){
        return 10;
    }
};


class AdvHero : public Hero
{
public:
    int getAd(){
        return 10000;
    }
};


//怪兽类
class Monster
{
public:
    virtual int getAd(){
        return 1000;
    }
};


class SuperMonster: public Monster
{
public:
    int getAd(){
        return 20000;
    }
};


//战斗方法
void playerFight(Hero *hp, Monster *mp)
{
    if(hp->getAd() > mp->getAd()){ //hp->getAd 发生了多态
        cout<<"英雄胜利,怪兽被打死"<<endl;
    }
    else{
        cout<<"英雄死掉,怪兽胜利"<<endl;
    }
}


int main()
{
    Hero h;
    Monster m;
    cout<<"Fight between hero and monster"<<endl;
    playerFight(&h,&m);


    AdvHero adh;
    cout<<"Fight between AdvHero and monster"<<endl;
    playerFight(&adh,&m);


    SuperMonster sm;
    cout<<"Fight between AdvHero and SuperMonster"<<endl;
    playerFight(&adh,&sm);



    return 0;
}

九十一. 学生多态案例(略,没啥内容)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值