八十九. 多态的定义和多态的三个必要条件
#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;
}
九十一. 学生多态案例(略,没啥内容)