手把手教你学C++(二十八)--C++抽象类

目录

抽象类的定义

示例:定义一个抽象类

抽象类的使用场景

示例:工厂模式

抽象类的特点

使用抽象类的优点

总结


 

在 C++ 中,尽管没有像 Java 或 C# 那样的正式“接口”关键字,但可以通过抽象类(Abstract Class)来模拟接口的行为。抽象类是指至少包含一个纯虚函数的类,这样的类不能被实例化。派生类必须实现抽象类中的所有纯虚函数,否则派生类本身也将成为抽象类。

抽象类的定义

抽象类通常用来定义一组需要由派生类实现的方法,从而提供一种规范或协议。抽象类可以包含数据成员和其他成员函数,但最重要的是包含一个或多个纯虚函数。

示例:定义一个抽象类

 

cpp

深色版本

#include <iostream>
using namespace std;

// 抽象类
class Drawable {
public:
    // 纯虚函数
    virtual void draw() const = 0;

    // 虚析构函数
    virtual ~Drawable() {}
};

// 派生类
class Circle : public Drawable {
public:
    void draw() const override {
        cout << "Drawing a circle" << endl;
    }
};

class Square : public Drawable {
public:
    void draw() const override {
        cout << "Drawing a square" << endl;
    }
};

void renderShape(const Drawable& drawable) {
    drawable.draw(); // 多态调用
}

int main() {
    Circle circle;
    Square square;

    renderShape(circle); // 输出 Drawing a circle
    renderShape(square); // 输出 Drawing a square

    return 0;
}

在这个例子中,Drawable 类是一个抽象类,因为它包含了一个纯虚函数 draw()CircleSquare 类继承自 Drawable 类,并实现了 draw() 方法。通过抽象类,我们可以定义一个统一的接口,并让不同的派生类来实现具体的行为。

抽象类的使用场景

抽象类通常用于定义一组共同的行为或属性,这些行为或属性应该由派生类来具体实现。抽象类可以定义一个框架,让派生类填充具体的实现细节。以下是几个常见的使用场景:

  1. 定义行为规范:当多个类共享一组行为,但具体实现各不相同时,可以定义一个抽象类来描述这些行为。
  2. 实现工厂模式:在工厂模式中,可以定义一个抽象类来描述产品的共性,然后由具体的工厂类来创建具体的实现。
  3. 实现策略模式:在策略模式中,可以定义一个抽象类来描述算法的共性,然后由具体的策略类来实现具体的算法。

示例:工厂模式

 

cpp

深色版本

#include <iostream>
using namespace std;

// 抽象类
class Shape {
public:
    virtual void draw() const = 0;
    virtual ~Shape() {}
};

// 派生类
class Circle : public Shape {
public:
    void draw() const override {
        cout << "Drawing a circle" << endl;
    }
};

class Square : public Shape {
public:
    void draw() const override {
        cout << "Drawing a square" << endl;
    }
};

// 工厂类
class ShapeFactory {
public:
    static Shape* createShape(const std::string& type) {
        if (type == "circle") {
            return new Circle();
        } else if (type == "square") {
            return new Square();
        } else {
            return nullptr;
        }
    }
};

int main() {
    Shape* shape1 = ShapeFactory::createShape("circle");
    Shape* shape2 = ShapeFactory::createShape("square");

    shape1->draw(); // 输出 Drawing a circle
    shape2->draw(); // 输出 Drawing a square

    delete shape1;
    delete shape2;

    return 0;
}

在这个例子中,Shape 是一个抽象类,它定义了 draw() 方法。CircleSquare 类继承自 Shape 类,并实现了 draw() 方法。ShapeFactory 类负责根据类型创建具体的 Shape 对象。

抽象类的特点

  • 不能实例化:抽象类至少包含一个纯虚函数,因此不能直接实例化。
  • 强制派生类实现:派生类必须实现抽象类中的所有纯虚函数,否则派生类本身也将成为抽象类。
  • 提供统一接口:抽象类可以定义一个统一的接口,让派生类来实现具体的行为。
  • 多态性:通过基类指针或引用来调用虚函数,可以实现多态性。

使用抽象类的优点

  • 代码复用:抽象类可以提供一些通用的实现,派生类可以选择性地覆盖或使用这些实现。
  • 代码清晰:通过定义抽象类,可以清晰地表达类之间的关系和责任。
  • 灵活性:抽象类提供了一种框架,派生类可以根据具体需求来填充细节,增加了代码的灵活性。

总结

在 C++ 中,通过定义包含纯虚函数的抽象类来模拟接口的行为。抽象类提供了定义一组需要由派生类实现的方法的能力,从而提供了一种规范或协议。理解和正确使用抽象类可以帮助你设计更加模块化、可扩展和易于维护的代码。通过抽象类,可以实现良好的封装和多态性,从而增强代码的灵活性和可读性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蘑菇二号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值