案例
#include <cstdlib>
#include <iostream>
using namespace std;
class HeroFighter
{
public:
virtual int power()
{
return 10;
}
private:
};
class EnemyFighter
{
public:
int attack()
{
return 15;
}
private:
};
class AdvHeroFighter : public HeroFighter
{
public:
virtual int power()
{
return 25;
}
};
//再添加一个更高级点的类
class AdvAdvHeroFighter : public HeroFighter
{
public:
virtual int power()
{
return 30;
}
};
//写了一个框架,可以调用
void PlayObj(HeroFighter *hf, EnemyFighter *ef)
{
//不写virtual关键字,将是静态链接编译,在编译阶段就确定了执行顺序
//加上virtual关键字,动态联编也叫迟绑定,C++编译器会特殊处理,在运行时,根据传入的类型,执行不同的对象函数,表现为多态
if (hf->power() > ef->attack()) //hf->power() 会有多态发生 传父类就调用父类的函数,传子类对象就调用子类的函数
{
printf("主角Win\n");
}
else
{
printf("主角挂掉\n");
}
}
/*面向对象三大概念:
封装:突破C语言函数的概念.......用类做函数参数的时候,可以使用对象的属性和方法
继承:可以复用代码
多态:可以兼容未来
实现多态的三个条件
1 要有继承
2 要有函数重写。。。C 虚函数
3 要有父类指针(父类引用)指向子类对象
多态是设计模式的基础,多态是框架的基础
*/
void main()
{
HeroFighter hf;
AdvHeroFighter Advhf;
EnemyFighter ef;
//再添加一个更高级点的类
AdvAdvHeroFighter AdvAdvhf;
cout << "*******************没有使用多态的方法案例**********************" << endl;
if (hf.power() > ef.attack())
{
printf("主角Win\n");
}
else
{
printf("主角挂掉\n");
}
if (Advhf.power() > ef.attack())
{
printf("Adv主角Win\n");
}
else
{
printf("Adv主角挂掉\n");
}
cout << "*******************使用多态的方法案例**********************" << endl;
PlayObj(&hf, &ef); //传父类对象就调用父类的函数
PlayObj(&Advhf, &ef); //传子类对象就调用子类的函数
cout << "*******************再添加一个更高级点的类**********************" << endl;
PlayObj(&AdvAdvhf, &ef); //不改变多态框架,可以兼容后来的更高级的类的对象
system("pause");
}
结果:
多态成立的条件
//间接赋值成立的3个条件
//1 定义两个变量。。。
//2 建立关联 。。。。
//3 *p
多态成立的三个条件
1 要有继承
2 要有函数重写。。。C 虚函数
3 要有父类指针(父类引用)指向子类对象
多态是设计模式的基础,多态是框架的基础