抽象类和接口是面向对象编程中非常重要的概念,它们可以帮助我们实现多态性和封装性。在C++中,通过抽象类和接口可以定义一种规范,让派生类必须实现这些规范。

1. 抽象类

抽象类是一种包含至少一个纯虚函数的类,纯虚函数是在基类中声明但没有实现的虚函数。一个类只要包含了一个纯虚函数,就成为抽象类,无法实例化对象。抽象类主要用于定义接口规范,让派生类去实现具体的功能。

class Shape {
public:
    virtual double getArea() const = 0; // 纯虚函数
    virtual double getPerimeter() const = 0; // 纯虚函数
};

class Circle : public Shape {
public:
    double getArea() const override {
        return 3.14 * radius * radius;
    }

    double getPerimeter() const override {
        return 2 * 3.14 * radius;
    }

private:
    double radius;
};

2. 接口

接口是一种只包含纯虚函数的抽象类,接口中的所有成员函数都是纯虚函数,没有成员变量或实现代码。接口定义了一组方法的规范,派生类必须实现这些方法。

class Printable {
public:
    virtual void print() const = 0; // 纯虚函数
};

class Book : public Printable {
public:
    void print() const override {
        cout << "This is a book." << endl;
    }
};

class Magazine : public Printable {
public:
    void print() const override {
        cout << "This is a magazine." << endl;
    }
};

3. 区别和联系

  • 抽象类是一种可以包含非纯虚函数和成员变量的类,派生类必须实现纯虚函数;接口是一种只包含纯虚函数的抽象类,用于定义规范。
  • 抽象类用于表示一种抽象概念的基类,通常包含一些通用的方法和属性;接口用于定义一组方法的规范,让不同的类实现这些方法。
  • 一个类可以继承多个接口,但只能继承一个抽象类。

通过抽象类和接口,可以实现更灵活的设计和更好的封装性,提高代码的可维护性和扩展性。在实际应用中,根据需求选择使用抽象类或接口来实现多态性和规范性。