C++中的抽象类是什么?

  • Post category:cplus

抽象类(Abstract class)是C++面向对象中的一个重要概念,它不能被实例化,必须被子类继承,并且子类必须实现父类中的抽象方法才能被实例化。抽象类是用于表达一组类的通用特征,具有相似行为的方法,但又不能实例化的情况下。

抽象类在C++中是通过定义纯虚函数(pure virtual function)来实现的。纯虚函数即没有函数体的虚函数,它通过在函数声明后加上= 0来定义。抽象类可以包含非纯虚函数和数据成员,但是不允许对纯虚函数提供实现。

例如,下面是一个简单的抽象类Shape的示例,其中包含一个纯虚函数area():

class Shape {
  protected:
    double width;
    double height;
  public:
    Shape(double w, double h) {
      width = w;
      height = h;
    }
    virtual double area() = 0;
};

可以看到,Shape类中通过定义一个width和一个height属性来描述所有的形状,在构造函数中完成了它们的初始化工作。在该类中还定义了一个抽象方法area(),用于计算形状的面积。由于面积计算方法与形状有关,具体的实现需要交给子类去实现。

接下来我们可以创建一个正方形子类Square,它继承自Shape,并实现了area()方法计算正方形的面积,如下所示:

class Square : public Shape {
  public:
    Square(double width) : Shape(width, width) {}
    double area() {
      return width * width;
    }
};

可以看到,在Square类中通过构造函数初始化了Shape类中的widthheight属性,并实现了area()方法用于计算正方形的面积。这就是抽象类的典型应用场景:定义相似的行为方法,但不做具体的实现,以便子类继承和扩展。

下面再给出一个例子,实现基于抽象类实现的简单的形状工厂实例。假设我们有一个抽象的ShapeFactory类,其中包含一个工厂方法create(),该方法返回一个Shape对象指针。接下来的CircleFactorySquareFactory两个子类,继承自ShapeFactory,并分别实现create()方法,返回对应的形状对象指针。示例代码如下所示:

class ShapeFactory {
  public:
    virtual Shape* create() = 0;
};

class CircleFactory : public ShapeFactory {
  public:
    Shape* create() {
      return new Circle(5);
    }
};

class SquareFactory : public ShapeFactory {
  public:
    Shape* create() {
      return new Square(3);
    }
};

当调用create()方法时,再根据需要创建具体的形状对象实例,这样就可以用抽象的ShapeFactory来统一创建各种形状对象了。

总之,抽象类是C++面向对象编程中的基本概念,通过定义抽象方法可以清晰地表达各种对象之间的通用特征和行为,从而实现代码的重用和扩展。