C++ - Polymorphism

Table of Contents

简介

多态 是C++语言的一大特色。一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态1。而且,仅仅对于对象的指针和引用的间接访问,才会发生多态。

虚函数

在使用类的C++语言中,抽象编程需要使用 虚函数 机制。基类与派生类的同名操作,只要标记上 virtual2 ,则该操作(虚函数)便具有多态性。一旦标记基类的函数为虚函数,便有连锁反应,后面继承的类中一切同名成员函数都变成了虚函数。这样一来,如果实际对象是基类对象,那么调用的就是基类成员函数;如果实际对象是派生类对象,那么调用的就是派生类成员函数。

虚函数仅用于继承结构层次中的基类和派生类。除了基类和派生类的函数名必须相同外,连参数类型、个数和顺序都要相同。也就是说,基类和派生类的虚函数不能只是名字重载,而且要一模一样3

  • 只有类的成员函数才能声明为虚函数。
  • 静态成员函数不能是虚函数。
  • 内联函数不能是虚函数。
  • 构造函数不能是虚函数。
  • 析构函数可以是且通常声明为虚函数。

纯虚函数

纯虚函数是指被标明为不具体实现的虚函数。纯虚函数一旦声明,就不用定义。声明形式是在虚函数声明形式后跟“ = 0”。

抽象类

抽象类是指在类定义中至少声明一个纯虚函数的类。抽象类是不允许有实例对象的,即不能由抽象类创建实例对象,其用途只是为了继承。

总结

总之, 要想实现多态, 必须用虚函数(在基类中用关键字virtual). 对于派生类, 必须对虚函数进行实现. 对于基类, 有两个选择: 第一, 实现虚函数; 第二, 将虚函数声明为纯虚函数(相应地, 基类也就变成了抽象类).

Footnotes:

1

钱能,“C++程序设计教程(第二版)”,清华大学出版社,2005年。

2

虚函数在继承层次结构中总是会自动地从基类传播下去。因此,派生类中的虚函数的标识(virtual)可以省略。

3

但是返回值可以不同。