纯虚函数(pure virtual function)和抽象类(abstract class)有什么区别?

在C++中,纯虚函数和抽象类是面向对象编程中实现多态和接口的关键概念。它们之间有紧密的联系,但也有明显的区别:

  1. 纯虚函数

    • 纯虚函数是一种没有实现体的虚函数,它在基类中声明,并且至少包含一个纯虚函数的类被称为抽象类。
    • 纯虚函数的声明使用 = 0 语法,例如:virtual void foo() = 0;
    • 纯虚函数的目的是定义一个接口,它强制要求任何派生类都必须提供该函数的具体实现。
  2. 抽象类

    • 抽象类(也称为接口类)是一个不能被实例化的类,它至少包含一个纯虚函数。
    • 抽象类的目的是定义一个接口规范,派生类通过实现这些纯虚函数来满足接口规范。
    • 抽象类可以包含虚函数和非虚函数,也可以包含数据成员。

它们之间的关系是:

  • 一个类如果包含至少一个纯虚函数,它就成为了一个抽象类。
  • 一个抽象类可以包含多个纯虚函数,也可以包含没有被声明为虚的普通成员函数。

纯虚函数和抽象类的主要区别在于它们的作用和使用方式:

  • 纯虚函数定义了必须由派生类实现的接口,它是一种语言机制,用于强制实现多态。
  • 抽象类是一个包含至少一个纯虚函数的类,它提供了一个框架,定义了一组相关的行为和属性,派生类需要实现这些行为和属性。

在实际应用中,通常先定义一个抽象类,然后在这个类中声明一些纯虚函数,以定义一个接口。派生类通过继承抽象类并提供纯虚函数的具体实现来实现多态。

例如:

// 定义一个抽象类
class Shape {
public:
    // 纯虚函数,定义接口
    virtual void draw() const = 0;

    // 非纯虚函数,可以有实现
    virtual void resize(float factor) {
        // 默认实现
    }
};

// 派生类实现抽象类中的纯虚函数
class Circle : public Shape {
public:
    void draw() const override {
        // Circle的draw实现
    }
};

在这个例子中,Shape 是一个抽象类,因为它包含一个纯虚函数 draw()CircleShape 的一个具体实现,它提供了 draw() 函数的具体实现。通过这种方式,Shape 类型的指针或引用可以指向 Circle 对象,实现多态。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值