# 纯虚函数与抽象类

URL: https://caijiao.org/cpp/oop/abstract
Source: docs/cpp/oop/abstract.md
Description: 本节介绍 C++ 中的纯虚函数与抽象类，讲解如何通过纯虚函数定义抽象类，以及如何在派生类中实现纯虚函数。

在 C++ 中，纯虚函数和抽象类是实现多态性和面向对象设计的重要工具。通过纯虚函数可以定义接口，并通过抽象类来规范派生类的行为。

## 纯虚函数

纯虚函数是没有函数体的虚函数，它在基类中声明，但不提供实现。纯虚函数的作用是强制要求派生类必须实现该函数。纯虚函数通过在函数声明末尾加 `= 0` 来标识。

### 纯虚函数的定义

```cpp
class Shape {
public:
    // 纯虚函数
    virtual void draw() = 0;  
};
````

上面的例子中，`draw()` 函数是纯虚函数，它没有提供函数体。任何派生自 `Shape` 类的类都必须实现 `draw()` 函数，否则这些派生类也将是抽象类。

## 抽象类

包含纯虚函数的类被称为抽象类。抽象类无法直接实例化，也就是说，不能创建抽象类的对象。抽象类的主要作用是作为其他类的基类，定义接口并要求派生类实现特定的行为。

### 抽象类示例

```cpp
#include <iostream>
using namespace std;

class Shape {
public:
    virtual void draw() = 0;  // 纯虚函数
    virtual ~Shape() {}  // 虚析构函数，确保派生类的析构函数正确调用
};

class Circle : public Shape {
public:
    void draw() override {  // 重写纯虚函数
        cout << "Drawing a circle." << endl;
    }
};

class Square : public Shape {
public:
    void draw() override {  // 重写纯虚函数
        cout << "Drawing a square." << endl;
    }
};

int main() {
    Shape* shape1 = new Circle();
    Shape* shape2 = new Square();

    shape1->draw();  // 输出: Drawing a circle.
    shape2->draw();  // 输出: Drawing a square.

    delete shape1;
    delete shape2;
    return 0;
}
```

### 输出：

```
Drawing a circle.
Drawing a square.
```

在上面的代码中，`Shape` 类是一个抽象类，它定义了一个纯虚函数 `draw()`。`Circle` 和 `Square` 类继承自 `Shape` 并实现了 `draw()` 函数，因此它们可以创建对象并正常使用。

## 纯虚函数与抽象类的关系

* **纯虚函数**：它是没有实现的虚函数，要求派生类提供具体的实现。
* **抽象类**：包含至少一个纯虚函数的类，被称为抽象类。抽象类无法实例化，只能作为基类使用，派生类必须实现纯虚函数。

### 使用抽象类定义接口

抽象类可以作为接口使用，定义一组必须由派生类实现的函数。这种设计模式非常适用于定义通用接口，并允许不同的派生类根据需求来实现具体的行为。

```cpp
class Drawable {
public:
    virtual void draw() = 0;  // 纯虚函数
    virtual void resize() = 0;  // 纯虚函数
};
```

在上面的例子中，`Drawable` 是一个接口，所有继承 `Drawable` 的类都必须实现 `draw()` 和 `resize()` 函数。

## 小结

* **纯虚函数**：是没有实现的虚函数，用 `= 0` 来标识，要求派生类必须实现该函数。
* **抽象类**：包含纯虚函数的类，不能实例化，只能作为基类供派生类继承并实现纯虚函数。
* **抽象类与接口**：抽象类可以被用作接口，规范派生类必须实现的行为。

通过纯虚函数和抽象类，C++ 提供了强大的多态性支持，允许设计灵活且可扩展的系统。
