C++语言的抽象类和纯虚函数介绍

概念说明

在C++中,抽象类和纯虚函数是面向对象编程中的重要概念,尤其在设计类的层次结构和接口时。它们使得开发者能够定义只包含声明而不包含实现的接口,从而允许派生类提供具体的实现。

  1. 抽象类

    • 抽象类是一种不能被实例化的类。它通常用作其他类的基类,只定义了一个通用的接口,但不提供具体的实现。
    • 抽象类的主要目的是定义一组相关的类所共有的公共接口。
    • 在C++中,通过将至少一个成员函数声明为纯虚函数来使类成为抽象类。
  2. 纯虚函数

    • 纯虚函数是一种在基类中声明但没有实现的虚函数。它的声明以 = 0 结尾,表示该函数没有实现。
    • 纯虚函数为派生类提供了一个框架,要求派生类必须实现该函数。
    • 包含纯虚函数的类自动成为抽象类,不能被实例化。

实现举例

// 抽象基类 Shape,定义了一个纯虚函数 getArea
class Shape {
public:
    // 纯虚函数
    virtual double getArea() const = 0; // 注意 = 0 表示没有实现
    virtual void draw() const {
        // 可以有其他的虚函数,这些函数可以有默认实现
        std::cout << "Drawing the shape..." << std::endl;
    }
};

// 派生类 Circle,实现了基类中的纯虚函数
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    // 实现 getArea
    double getArea() const override {
        return 3.14159 * radius * radius;
    }
};

int main() {
    // Shape s; // 错误:抽象类不能被实例化
    Circle c(5.0); // 正确:Circle 提供了所有纯虚函数的实现
    std::cout << "Area: " << c.getArea() << std::endl;
    c.draw(); // 调用基类的 draw 函数
    return 0;
}
实例说明

在这个例子中,Shape 是一个抽象基类,它定义了一个纯虚函数 getAreaCircleShape 的一个派生类,它提供了 getArea 的具体实现。由于 Shape 包含纯虚函数,因此它不能被实例化。但是,Circle 提供了所有纯虚函数的实现,所以它可以被实例化,并且可以通过 Circle 对象调用这些函数。

总结

C++为什么要引入纯虚函数和抽象类?自己感觉主要是下面两点:

  1. 强制要求派生类提供特定功能的实现,从而确保多态性的正确应用。
  2. 设计上可以描述一组相关类的共同接口,这样客户端代码可以通过基类指针或引用调用这些方法,而不必关心具体的派生类类型。

你可能感兴趣的:(C/C++,c++,开发语言)