1. 多态的概念
多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。再举个栗子: 最近为了争夺在线支付市场,支付宝年底经常会做诱人的扫红包-支付-给奖励金的活动。那么大家想想为什么有人扫的红包又大又新鲜8块、10块...,而有人扫的红包都是1毛,5毛....。其实这背后也是一个多态行为。支付宝首先会分析你的账户数据,比如你是新用户、比如你没有经常支付宝支付等等,那么你需要被鼓励使用支付宝,那么就你扫码金额=random()%99;比如你经常使用支付宝支付或者支付宝账户中常年没钱,那么就不需要太鼓励你去使用支付宝,那么就你扫码金额 = random()%1;总结一下:同样是扫码动作,不同的用户扫得到的不一样的红包,这也是一种多态行为。ps:支付宝红包问题纯属瞎编,大家仅供娱乐。
2. 多态的定义及实现
2.1.多态的构成条件
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要 构成多态还有两个条件:(1)子类虚函数重写的父类虚函数(重写:三同(函数名/参数/返回值)+虚函数)(2)父类指针或者引用去调用虚函数。
2.2.虚函数
虚函数:即被virtual修饰的类成员函数称为虚函数class Person { public: virtual void BuyTicket() { cout << "买票-全价" << endl;} };
2.3.虚函数的重写
虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。注意:1.在重写基类虚函数时,如果基类和派生类都将virtual关键字删去,那么就构成了隐藏,在派生类中就调不了基类的该函数了。2.在重写基类虚函数时,派生类的虚函数不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用注:在Pay函数中形参使用的是基类的引用变量(使用基类的指针变量也可以),因为基类的指针可以接收指向基类的对象也可以接收指向派生类的对象
模拟一个买票系统,代码如下所示,左边代码为父类引用去调用虚函数,右边代码为父类指针去调用虚函数
注:switch case语句中,语法的限制case语句里面不支持定义对象,如果要在case语句里面定义对象需要使用大括号,相当于加了一个域,如上图二所示