C++学习之路—多态性与虚函数(二)纯虚函数与抽象类
(根据《C++程序设计》(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明)
1 纯虚函数
在前面的博客中已经提到:有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义。举个小例子:如果定义基类Point,在基类中是不需要求面积的area函数的,因为“点”是没有面积的。但是在其直接派生类Circle和间接派生类Cylinder中都需要area函数,而且这两个函数的功能不同。为了处理这种情况,C++给出了纯虚函数的概念,如本例中可以将基类Point中的area函数声明为纯虚函数:
1: virtual float area( ) const = 0 ; //纯虚函数
这就将area声明为一个纯虚函数。纯虚函数是在声明虚函数是被“初始化”为0的函数。声明纯虚函数的一般形式为:
virtual 函数类型 函数名 (参数列表)= 0 ;
注意:(1)纯虚函数没有函数体。
(2)最后面的“ = 0 ”并不表示函数的返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;
(3)这是函数声明语句,最后应有分号。
纯虚函数只有函数的名字而没有函数的功能,不能被调用。纯虚函数的作用是在基类中为派生类保留一个函数的名字,以便派生类根据需要对它进行定义。如果在基类中没有保留函数名字,则无法实现多态性。如果一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍为纯虚函数。
2 抽象类
在面向对象的程序设计中,往往有一些类不用来生成对象。定义这些类的唯一目的是用它作为基类去建立派生类。这种不用来定义对象而只作为一种基本类型用作继承的类,称为抽象类,也称为抽象基类。凡是包含纯虚函数的类都是抽象类。因为纯虚函数是不能被调用的,包含纯虚函数的类是无法建立对象的。抽象类的作用是作为一个类族的共同基类,或者说,为一个类族提供一个公共接口。
如果在抽象类所派生出的抽象类中对基类的所有的纯虚函数进行了定义,那么这些函数就被赋予了功能,可以被调用。这个派生类就不是抽象类,而是可以用来定义对象的具体类。如果在派生类中没有对所有的纯虚函数进行定义,则此派生类仍然是抽象类,不能用来定义对象。
虽然抽象类不能定义对象,但是可以定义指向抽象类数据的指针变量。当派生类成为具体类之后,就可以用这种指针指向派生类对象,然后通过该指针调用虚函数,实现多态性的操作。