一、概念
1.多态定义:
多态是对程序通用性的追求,同一名称实现不同的功能,达到行为标识同一。
2.多态的实现:
编译时(静态)的多态:
- 通过函数重载和运算符重载实现
- 这种多态是静态的
运行时(动态)的多态 :
- 通过类继承关系和虚函数实现
- 这种多态是动态的
- 程序执行前,无法根据函数名和参数来确定该调用哪一个函数
- 在执行过程中,根据执行的具体情况来动态地确定
二、虚函数
1.虚函数定义:
虚函数必须是类的成员函数,使用关键字virtual说明
2.定义格式:
virtual 返回类型 函数名(参数表)
{
...
};
2.虚函数的继承性:
- 虚函数具有继承性。基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
- 因此,在派生类中重新定义虚函数时,不必加关键字virtual。
- 在派生类中重新定义虚函数时,不仅要同名,参数列表和返回类型也必须全部与基类中的虚函数一样,否则会被认为是重载,而不是虚函数
3.注意:
- 若虚函数的定义形式为类内定义,类外声明。“virtual”就只用于类内声明,类外定义不使用“virtual”。
- 虚函数仅适用于有继承关系的类对象,只有类的成员函数才能说明为虚函数。
- 类中的静态成员函数为同一类对象共有,不限于某个对象,不能作为虚函数。
- 因为在调用构造函数时对象还没有完成创建,所以构造函数不能定义为虚函数。
- 析构函数可以定义为虚函数,通常把析构函数定义为虚函数,实现撤销对象时的多态。
4.多态VS类型兼容:
5.纯虚函数
纯虚函数是类的成员函数,类内的定义格式如下:
virtual 返回类型 函数名(参数表)=0;
有时,定义基类不是为了衍生基类对象,而是为了建立一个通用模板,派生出一系列子类或者为动态多态提供操作接口。
为了解决以上问题,可以将基类的成员函数定义为纯虚函数。
6.抽象类VS纯虚函数
虽然纯虚函数没有实现代码,但它为动态多态提供了操作接口
含有纯虚函数的类称为抽象类
抽象类无法实例化,不能生成对象
继承了抽象类的派生类可以依照本类的特性完成纯虚函数的定义,然后产生对象
如果继承了抽象类的派生类不完成纯虚函数的定义,派生类也成为抽象类
三、多态作用
基类派生出多个子类,这些派生类和基类一起构成了类的“家族”
多态提供了基于类族的通用操作接口
提升了程序的通用性,针对某一个类写出一段程序,这段程序可以适用于该类的所有派生类