c++面向对象编程的思想之一是可以使用继承。继承中一个重要的思想是使用抽象基类(abstract base class,ABC)。
假设我们开发一个程序,需要使用椭圆和圆两种图形。因为圆是椭圆的一种特殊情形,根据继承‘is-a’的思想,自然会想到先定义一个Eclipse类,再将Circle类继承自Eclipse类。
但这样实现有不好的地方。
椭圆中,需要表示长半轴和短半轴、angle(长轴和水平线的夹角),还可以有rotate方法将椭圆进行旋转,这些都是圆所不需要的,将圆继承自椭圆,是十分笨拙的。
一种更好的办法是,使用抽象基类(ABC),将椭圆和圆的共性部分,例如坐标x、y,共同的方法例如移动move、计算面积Area抽象出来放到一个基类shape中,再将Eclipse和Circle类分别继承shape,这样就可以使用基类指针数组同时管理Eclipse和Circle对象。
当类声明中包含纯虚函数时,不能创建该类的对象,此类称为抽象基类。
纯虚函数的声明如下(以Area为例):
virtual double Area() const =0 ;
ABC类shape的定义如下:
class Shape{
private:
double x;
double y;
public:
Shape(double x0=0,y0=0):x(x0),y(y0){} //构造函数
virtual ~Shape(){} //析构函数
void move(int nx,ny){x=nx;y=ny;} //move函数
virtual double Area() const =0; //纯虚函数
}
此后,就可以从Shape类派生出Eclipse类和Circle类,在各自的派生类中加入需要的属性