1. 多态的概念
通俗来说就是多种形态。
多态分为编译时多态(静态多态)和运行时多态(动态多态)。
编译时多态主要就是我们之前提过的函数重载和函数模板,同名提高传不同的参数就可以调
用不同的函数,通过参数不同达到多种形态,由于他们实参传递给形参匹配是在编译时完}
成,我们把编译时⼀般归为静态,运⾏时归为动态。
运行时多态,就是指完成某个行为,通过传不同的参数可以产生不同的行为,达到多种形
态。比如买票,普通人全价购买,学生则可以搬家,军人则是优先买票。
2. 多态的定义及实现
2.1 多态的构成条件
多态就是一个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了 Person。Person对象买票全价,Student对象优惠买票。
2.1.1 实现多态还有两个必须的条件:
• 必须指针或者引⽤调⽤虚函数
• 被调⽤的函数必须是虚函数。
要想实现多态的效果,第一必须是基类的指针或者引用,因为只有基类指针或者引用才即可以指向基类的对象又可以指向派生类对象。第二派生类必须对基类的虚函数重写/覆盖,只有重写/覆盖之后,派生类才能有不同的形态,达到多态的效果。
2.1.2 虚函数
类成员函数前⾯加virtual修饰,那么这个成员函数被称为虚函数。注意⾮成员函数不能加
virtual修饰。
class Person
{
public:
virtual void BuyTicket() { cout << "买票-全价" << endl;}
};
这里的virtual与虚继承的vircual式一个关键字,但是不同的作用,我们一定要区分清楚。
2.1.3 虚函数的重写/覆盖
若派生类和基类有一个完全相同的基函数(要求三同,即函数返回值相同,函数名相同,函
数参数的个数及类型和顺序相同),称派生类的虚函数重写了基类的虚函数。
注意: 在重写基类虚函数时候,派生类虚函数在不加virtual的情况下,也构成重写,因为派
生类把基类继承下来了,其依然保持虚函数的属性),但这种写法不规范,也不推荐,但这
是比试中的一大坑点,需要注意一下。
2.1.4 多态场景的⼀个选择题
以下程序输出结果是什么()
A: A->0 B: B->1 C: A->1 D: B->0 E: 编译出错 F: 以上都不正确
class A
{
publi