6.3 纯虚函数与同一协议的多版本
在大多数情况下,多态基类中的虚函数不被调用。有时,多态基类的通用性非常之高,以至于它的实例对象几乎没有意义。这是因为通用性高的多态基类的功能是为了表达统一的协议和接口,提供一套成员函数的核心集合和派生类将使用的变量,描述公共继承模式,便于动态联编,为统一协议提供多种执行版本。为了防止抽象性高的类被实例化,可以在程序中加入出错代码,当企图实例化时给出出错信息。更好的办法是让编译器来做这个工作。于是,C++提供了纯虚函数(pure virtual function)的概念和实现。
6.3.1 纯虚函数的定义和性质
当设计的基类并不与实例对象直接联系起来时,类中定义函数并不作具体工作,而是为派生类提供公共界面,那么可将其函数定义为纯虚函数。
纯虚函在基类中的原型说明形式如下:
virtual type func_name(parameter_list)=0;
这个说明与一般虚函数相比的特殊之处是,设置函数等于0,它通知编译器该函数还没有定义函数体。在该类的VTABLE中,为该函数留了位置,但为空。
C++提供的纯虚函数的性质是,在类说明中不需要提供实际操作定义,具有纯虚函数的类也不能定义任何对象,它的任何派生类都应强制覆盖这个纯虚函数。
注意:构造函数和析构函数都不能是纯虚函数。
6.3.2 抽象类的用法如果一个类包含有纯虚函数,则称为抽象类(abstract base class)。
由于抽象类中至少含有一个纯虚函数(没有真正的函数体)。因而在使用上,应明确下列要点:
(1)抽象类不能创建相应的对象,只能作为其他类的基类。
(2)抽象类不是完整数据类型,不能作函数返回类型、参数类型或显式转换类型。
(3)可以建立指向抽象类的指针和引用,并通过基类(抽象类)指针指向派生类,实现运行时的多态机制。
虽然纯虚函数不被多态调用,但是它可以有自己的定义,其目的是将公共的代码放在高层次的类中,便于被尽量多的类继承,减少书写重复代码的工作量。
[例6.5] 抽象类的用法EX6_5.CPP。
6.3.3 纯虚函数的应用例析利用纯虚函数的多态性编程,通过一个构造存储对象实例来讨论。
[例6.6] 纯虚函数的应用例析EX6_6.CPP。
在大多数情况下,多态基类中的虚函数不被调用。有时,多态基类的通用性非常之高,以至于它的实例对象几乎没有意义。这是因为通用性高的多态基类的功能是为了表达统一的协议和接口,提供一套成员函数的核心集合和派生类将使用的变量,描述公共继承模式,便于动态联编,为统一协议提供多种执行版本。为了防止抽象性高的类被实例化,可以在程序中加入出错代码,当企图实例化时给出出错信息。更好的办法是让编译器来做这个工作。于是,C++提供了纯虚函数(pure virtual function)的概念和实现。
6.3.1 纯虚函数的定义和性质
当设计的基类并不与实例对象直接联系起来时,类中定义函数并不作具体工作,而是为派生类提供公共界面,那么可将其函数定义为纯虚函数。
纯虚函在基类中的原型说明形式如下:
virtual type func_name(parameter_list)=0;
这个说明与一般虚函数相比的特殊之处是,设置函数等于0,它通知编译器该函数还没有定义函数体。在该类的VTABLE中,为该函数留了位置,但为空。
C++提供的纯虚函数的性质是,在类说明中不需要提供实际操作定义,具有纯虚函数的类也不能定义任何对象,它的任何派生类都应强制覆盖这个纯虚函数。
注意:构造函数和析构函数都不能是纯虚函数。
6.3.2 抽象类的用法如果一个类包含有纯虚函数,则称为抽象类(abstract base class)。
由于抽象类中至少含有一个纯虚函数(没有真正的函数体)。因而在使用上,应明确下列要点:
(1)抽象类不能创建相应的对象,只能作为其他类的基类。
(2)抽象类不是完整数据类型,不能作函数返回类型、参数类型或显式转换类型。
(3)可以建立指向抽象类的指针和引用,并通过基类(抽象类)指针指向派生类,实现运行时的多态机制。
虽然纯虚函数不被多态调用,但是它可以有自己的定义,其目的是将公共的代码放在高层次的类中,便于被尽量多的类继承,减少书写重复代码的工作量。
[例6.5] 抽象类的用法EX6_5.CPP。
6.3.3 纯虚函数的应用例析利用纯虚函数的多态性编程,通过一个构造存储对象实例来讨论。
[例6.6] 纯虚函数的应用例析EX6_6.CPP。