八十九. 多态的定义和多态的三个必要条件
#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: int getAd(){ return 1000; } }; //战斗方法 void playerFight(Hero *hp, Monster *mp) { if(hp->getAd() > mp->getAd()){ //hp->getAd 发生了多态 cout<<"英雄胜利,怪兽被打死"<<endl; } else{ cout<<"英雄死掉,怪兽胜利"<<endl; } } int main() { Hero h; Monster m; playerFight(&h,&m); AdvHero adh; playerFight(&adh,&m); return 0; }九十一. 学生多态案例