C++抽象类和纯虚函数
抽象类不能够创建对象实例
在继承关系中,从基类到派生类,其实是一个由抽象到具体的过程——派生类相对于其基类更加具体,而基类相对于派生类更加抽象。拿我们之前的例子来说:几何图像是一个抽象的概念,它可以具体的表现为圆、矩形、三角形等具体的几何图形。那么我们就可以说几何图形是一个抽象类。
在C++中,如果一个类中有纯虚函数,那么它就是一个抽象类。纯虚函数和虚函数的目的就是为了提供一个统一的接口,而不同之处在:纯虚函数不能实现,只能在子类中重载(有点像Java中接口Interface的概念),这样做是为了防止基类(抽象类)实例化。
上面是用自然语言描述的抽象类,那么用程序语言如何表示抽象类呢?
在Java中抽象类需要使用abstract关键字,但是C++中没有关键字abstract。
纯虚函数和虚函数很像,也需要关键字virtual,但是要在函数的最后加" = 0",如下所示:
//获取面积 virtual double getArea() = 0;
之前我们说过,由于我们不知道一个几何图形具体是什么,所以也无法实现GeomtricObject类的getArea方法(每种几何图形计算面积的公式都不同),也就是说getArea这个函数不能再基类中实现,而需要在子类中实现。那么你可能要问了,既然要在子类中实现,为什么还要在基类中写一个纯虚函数呢?
因为我们的类表示的是一个抽象的集合,我们要把它所表示的事物的属性动作表示出来。一个几何图形必然是有面积的,既然有面积,那么我们就需要有一个方法来获取它。哪怕这个方法不能在基类中实现,我们也应该写出来。
不仅如此,抽象类相当于一个接口。如果我们是在多人协作开发,一位同事要查看并使用你的GeomtricObject类,如果你写了getArea纯虚函数,那么他就会知道:有这样一个方法可以让GeomtricObject的派生类得到对象实例的面积;但假如不写这个函数,他就完全不知道有这样一种方法,也就无法使用,又或者他需要阅读基类和所有派生类的代码,才能够知道如何获取面积。