跳转到内容

C++ 编程/类/抽象类/纯抽象类

来自维基教科书,开放的书籍,为开放的世界

纯抽象类

[编辑 | 编辑源代码]

抽象类是指在其中声明了成员函数但没有定义成员函数的类。C++ 中表达这个概念的方式是将成员函数声明分配为零。

示例
class PureAbstractClass 
{
public:
  virtual void AbstractMemberFunction() = 0;
};

纯抽象类只有抽象成员函数,没有数据或具体成员函数。通常,纯抽象类用于定义接口,并且旨在被具体类继承。它是一种强制执行类设计者和该类用户之间契约的方式。此类的用户必须为该类编译声明匹配的成员函数。

纯抽象类的使用示例
 class DrawableObject 
 {
  public:
    virtual void Draw(GraphicalDrawingBoard&) const = 0; //draw to GraphicalDrawingBoard
 };

 class Triangle : public DrawableObject
 {
 public:
   void Draw(GraphicalDrawingBoard&) const; //draw a triangle
 };

 class Rectangle : public DrawableObject
 {
 public:
   void Draw(GraphicalDrawingBoard&) const; //draw a rectangle
 };

 class Circle : public DrawableObject
 {
 public:
   void Draw(GraphicalDrawingBoard&) const; //draw a circle
 };

 typedef std::list<DrawableObject*> DrawableList;

 DrawableList drawableList;
 GraphicalDrawingBoard drawingBoard;

 drawableList.pushback(new Triangle());
 drawableList.pushback(new Rectangle());
 drawableList.pushback(new Circle());

 for(DrawableList::const_iterator iter = drawableList.begin(), 
    endIter = drawableList.end();
    iter != endIter;
    ++iter)
 { 
   DrawableObject *object = *iter;
   object->Draw(drawingBoard);
 }

请注意,这是一个有点人为的例子,可绘制对象没有完全定义(没有构造函数或数据),但它应该能让您对定义接口的强大功能有一个大致了解。一旦对象被构造,调用接口的代码不知道被调用对象的任何实现细节,只知道接口本身。对象 GraphicalDrawingBoard 是一个占位符,代表将要绘制对象的载体,例如视频内存、绘图缓冲区、打印机。

请注意,在纯抽象基类中添加具体成员函数和数据,存在很大的诱惑。这必须被抵制,通常这是接口没有很好地分解的标志。数据和具体成员函数往往意味着特定的实现,因此可以从接口继承,但不能是该接口。相反,如果具体类之间存在一些共同点,那么创建一个从纯抽象类继承其接口并定义具体类的共同数据和成员函数的抽象类效果很好。应该仔细考虑是否应该使用继承或聚合。过多的继承层级会使类的维护和使用变得困难。通常,继承的接受层级最大约为 3 层,超过此层级,通常需要对类进行重构。一个通用的测试是“是”与“有”,例如正方形是一种矩形,但正方形有一组边。

华夏公益教科书