当某个类是一个类的特殊情况时(例如:圆是长轴和短轴相等的椭圆),可以考虑采用继承的方式来实现。但是派生类可能并不需要继承基类所有的成员变量和成员方法,例如:椭圆包括中心坐标、长半轴长,短半轴长、方向角等成员变量,移动椭圆、返回椭圆面积、旋转椭圆、缩放长半轴和短半轴等成员方法;而圆只需要中心坐标、半径等成员变量,成员方法也有一些是不需要的或者实现方式是不同的,所以这样分析下来,还不如直接定义一个圆的类来的方便。
但是,将圆的类单独定义,就忽略了它和椭圆具有共性这一事实 。为了解决这一问题,可以采用抽象基类(Abstract Base Class,ABC)的方法。
从Ellipse和Circle类中抽象出它们的共性,将这些共性放到一个ABC中,然后从该ABC派生出Ellipse和Circle类,这样,便可以使用基类指针数组同时管理Ellipse和Circle对象。例如:椭圆和圆的共同点是中心坐标、Move()方法,因此ABC可以这么定义:
class Base { private: double x; //中心坐标 double y; public: Base(double x0 = 0,double y0 = 0); virtual ~Base(); void Move(int nx,int ny) //移动 { x = nx; y = ny; } }然后Ellipse类和Circle类都从Base类中继承,对于派生类中都有但是实现方式不同的成员方法可以在基类中定义纯虚函数,例如面积,椭圆和圆的面积计算方法是不同的,而且ABC中也没有包含必要的数据成员,所以根本就不能实现Area()函数,C++通过使用纯虚函数提供未实现的函数,纯虚函数声明的结尾处为 = 0,如下所示:
class Base { private: double x; //中心坐标 double y; public: Base(double x0 = 0,double y0 = 0); virtual ~Base(); void Move(int nx,int ny) //移动 { x = nx; y = ny; } virtual double Area() const = 0; //纯虚函数 }注意:
当类声明中包含纯虚函数时,则不能创建该类的对象。包含纯虚函数的类只能用作基类,要成为真正的ABC,必须至少包含一个纯虚函数。在虚函数后加= 0可使虚函数变为纯虚函数。纯虚函数只是一个接口,可以不需要定义,在派生类中使用常规虚函数来实现这种接口。派生类中必须实现ABC中的纯虚函数,这是一种接口规则