C++中的虚函数和纯虚函数都是实现多态的重要机制。
一、 虚函数
1.1 虚函数的定义
虚函数就是在类中被关键字virtual声明(不是定义)的函数,一般只在基类中声明虚函数。
virtual 返回值类型 函数名(形参表)
{
函数体
}
例如:virtual void func();
1.2 虚函数定义时遵循的规则
- 虚函数必须是类的成员函数,不能是类的静态成员函数或友元函数。因为虚函数的调用需要靠特点的对象来确定需要调用哪一个函数;
- 在派生类中必须对基类中的虚函数进行重写override,即在派生类中重新定义与基类中虚函数;
- 构造函数不可以是虚函数。因为构造函数是在对象创建时自动运行的,而虚函数是为了实现多态性,即根据不同的对象在运行过程中才决定与哪个函数建立联系,因此构造函数不可以是虚函数;
- 析构函数可以声明为虚函数;
- 基类中的虚函数不论被公有继承多少次,在多级派生类中仍然是虚函数,派生类中的虚函数可以省略virtual,父类中不可省略;
- 必须使用基类指针访问虚函数,才能获得运行的多态性 。虽然可以使用对象名和点运算符的方式来调用虚函数,但是这种调用是在编译时进行的,是静态联编,不能利用虚函数的好处;
- 可以使用基类的指针或引用来访问派生类中的同名函数。
二、纯虚函数
2.1 纯虚函数的定义
纯虚函数是一种特殊的虚函数,它没有函数体,需要在派生类中进行实现。纯虚函数的定义是在虚函数的声明后面加上“=0”即可。
virtual void func() = 0;
包含纯虚函数的类称为抽象类,抽象类不能实例化对象,只能用于派生其他类。
**注意:**纯虚函数必须在派生类中实现,否则派生类也会变为抽象类。若在派生类中不想实现某个纯虚函数,可以将其声明为虚函数,并提供一个默认实现。这个默认实现可以是一个空函数体,也可以是一个具体的实现。
2.2 纯虚函数的作用
使派生类仅仅只是继承函数的接口,即通过在基类中定义一组纯虚函数,可以明确指定子类必须实现的方法。
三、 抽象类
3.1 抽象类的定义
抽象类是一种特殊类,包含纯虚函数的类称为抽象类。
class Person
{
public:
virtual void show() = 0;
};
如示例所示,Person类是一个抽象类。
3.2 抽象类使用时的注意事项
- 抽象类不能实例化对象;
- 若在派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,派生类仍然为抽象类。
**注意:**在基类中定义一个函数为虚函数,不代表该函数不被实现。定义为虚函数为了实现可以用基类的指针来调用子类中的函数;若在基类中定义一个函数为纯虚函数,该函数不在基类中实现。