C++多态

函数的多种形态

父类指针的多种形态

通过父类的指针或引用指向子类的对象,可以访问子类中重写的父类中的方法。

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐的记事本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值