函数的多种形态
父类指针的多种形态
通过父类的指针或引用指向子类的对象,可以访问子类中重写的父类中的方法。
1.实现多态的必要条件:
1.继承
2.父类指针或引用指向子类对象
3.虚函数
4.函数重写
2.虚函数
声明或定义函数前加上 virtual
例如 virtual void show();//此时show函数就变成了 虚函数
//虚函数可以被子类重写
3.函数重写:
//子类可以定义和父类原型相同的函数
函数重写要求:
1.只能发生在父子类之间
2.函数原型必须相同:
返回值 函数名 形参列表 const属性 等都要相同
例:
#include <iostream>
using namespace std;
class Parent{
private:
string name;
int age;
public:
Parent(){}
Parent(string n,int a):name(n),age(a){}
//void show(){//如果此处的show 不是虚函数,父类的指针或引用指向子类对象时
//只能访问父类中的函数
virtual void show(){//虚函数 可以被子类重写
cout<<"Parent show():"<<name<<" "<<age<<endl;
}
};
class Son:public Parent{
private:
string toy;
public:
Son(){};
Son(string n,int a,string t):Parent(n,a),toy(t){}
void show(){//重写父类中虚函数
//如果父类的show函数是虚函数,子类中重写的版本即使不加virtual修饰也是虚函数
//可以接着被自己的子类重写
cout<<"Son show():"<<toy<<endl;
}
};
int main(int argc, const char *argv[])
{
Son s1("小明",18,"car");
//s1.show();
Parent *p1 = &s1;
p1->show();//子
Parent &r1 = s1;
r1.show();//子
Son *p2 = new Son("小红",16,"跳绳");
p2->show();//子
Parent *p3 = new Parent("李华",20);
p3->show();//父
Parent *p4 = new Son("张三",19,"钱");
p4->show();//子
return 0;
}
4.多态应用举例
#include <iostream>
using namespace std;
//英雄类
class Hero{
protected:
string name;
int life;
public:
Hero(){}
Hero(string n,int l):name(n),life(l){}
virtual int get_life(){return life;}
string get_name(){return name;}
void show(){
cout<<"英雄 "<<name<<" 的生命值为 "<<life<<endl;
}
};
//刺客类
class Assassin:public Hero{
private:
int attack;//攻击力
public:
Assassin(){}
Assassin(string n,int l,int a):Hero(n,l),attack(a){}
int get_life(){return 10000;}
void show(){
cout<<"英雄 "<<name<<" 的生命值为 "<<life<<" 攻击力 :"<<attack<<endl;
}
};
//法师类
class Master:public Hero{
private:
string skill;//技能
public:
Master(){}
Master(string n,int l,string s):Hero(n,l),skill(s){}
virtual int get_life(){return 8000;}
void show(){
cout<<"英雄 "<<name<<" 的生命值为 "<<life<<" 技能是 :"<<skill<<endl;
}
};
//void hero_pk(Assassin &x, Master &y);
//如果多个子类之间都要PK
//那只因为类型不同,我们就要写很多个重载版本的函数
//非常啰嗦 也非常浪费时间精力
//可以用多态的特性实现此功能
void hero_pk(Hero &x, Hero &y){
if(x.get_life() >= y.get_life()){
cout<<x.get_name()<<" "<<x.get_life()<<" 胜利"<<endl;
}else{
cout<<y.get_name()<<" "<<y.get_life()<<" 胜利"<<endl;
}
}
int main(int argc, const char *argv[])
{
Assassin a1("阿轲",5000,2000);
a1.show();
Master m1("妲己",6000,"爱心攻击");
m1.show();
hero_pk(a1,m1);
return 0;
}