C++纯虚函数与抽象基类:构建可扩展的面向对象设计

今天 4650阅读

在C++面向对象编程中,抽象基类与纯虚函数是实现接口规范和多态行为的核心机制。通过定义不能被实例化的抽象类,开发者可以强制派生类实现特定接口,从而确保代码结构的一致性与可维护性。

纯虚函数通过在函数声明后添加 = 0 来定义,它没有具体实现,仅作为接口契约存在。包含至少一个纯虚函数的类即为抽象基类,无法直接创建对象,但可作为指针或引用类型使用。

以下是一个典型示例:

C++纯虚函数与抽象基类:构建可扩展的面向对象设计

// 抽象基类 Shape 定义通用接口
class Shape {
public:
    // 纯虚函数:要求所有派生类必须实现
    virtual double area() const = 0;

    // 虚析构函数确保正确释放派生类资源
    virtual ~Shape() = default;
};

// 派生类 Circle 实现纯虚函数
class Circle : public Shape {
private:
    double radius;
public:
    explicit Circle(double r) : radius(r) {}

    double area() const override {
        return 3.14159 * radius * radius;
    }
};

// 派生类 Rectangle 实现纯虚函数
class Rectangle : public Shape {
private:
    double width, height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}

    double area() const override {
        return width * height;
    }
};

在实际使用中,可通过基类指针统一管理不同派生类对象:

#include <iostream>
#include <vector>

int main() {
    std::vector<Shape*> shapes;
    shapes.push_back(new Circle(2.0));
    shapes.push_back(new Rectangle(3.0, 4.0));

    for (const auto& shape : shapes) {
        std::cout << "Area: " << shape->area() << "\n";
    }

    // 清理内存
    for (auto* s : shapes) delete s;
    return 0;
}

这种设计不仅提升了代码的可扩展性——新增图形类型无需修改现有逻辑,还强化了接口一致性,避免遗漏关键方法实现。

总结建议:在需要定义通用接口且不希望该类被直接实例化时,应优先使用抽象基类与纯虚函数。同时,务必为抽象基类提供虚析构函数,以防止资源泄漏,确保程序健壮性与可维护性。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。