📜  cpp 使类抽象 - C++ (1)

📅  最后修改于: 2023-12-03 14:40:14.899000             🧑  作者: Mango

CPP 使类抽象 - C++

在 C++ 中,可以通过类的成员函数和访问限定符来实现抽象。抽象类是不能被实例化的类,它只用于提供接口和规范。一个抽象类必须至少包含一个纯虚函数,否则它与普通类没有任何区别。

抽象类的定义

抽象类的定义方式为在类中将至少一个函数声明为纯虚函数。形式如下:

class AbstractClass {
public:
    virtual void pure_virtual_fn() = 0;
    // 此处 "= 0" 表示这是纯虚函数,没有实现体
};

在上述代码中,pure_virtual_fn() 是一个纯虚函数。它没有函数体,其中的 = 0 告诉编译器不需要为该函数生成代码。

一个类中只要包含了纯虚函数,就称其为抽象类。抽象类无法直接被实例化:

AbstractClass ac; // 错误!不能直接实例化抽象类
抽象类的应用

抽象类通常用于定义一组接口规范,让其他类来实现这些接口。举例如下:

class Shape {
public:
    // 计算面积(纯虚函数)
    virtual double area() const = 0;
    // 计算周长(纯虚函数)
    virtual double perimeter() const = 0;
};

class Rectangle : public Shape {
public:
    Rectangle(double width, double height)
        : width_(width), height_(height)
    {}

    double area() const override {
        return width_ * height_;
    }

    double perimeter() const override {
        return 2 * (width_ + height_);
    }

private:
    double width_;
    double height_;
};

class Circle : public Shape {
public:
    Circle(double radius) : radius_(radius) {}

    double area() const override {
        return PI * radius_ * radius_;
    }

    double perimeter() const override {
        return 2 * PI * radius_;
    }

private:
    const double PI = 3.14159265358979323846;
    double radius_;
};

在这个例子中,Shape 定义了一组接口规范,让其他类来实现它们。RectangleCircle 继承于 Shape,并实现了其中的纯虚函数。这样,在程序中就可以通过 Shape* 指针来指向 RectangleCircle 的实例,并调用其接口:

std::vector<Shape*> shapes = {new Rectangle(3, 4), new Circle(1.5)};

for (auto s : shapes) {
    std::cout << "Area: " << s->area() << std::endl;
    std::cout << "Perimeter: " << s->perimeter() << std::endl;
}
小结

通过定义抽象类和纯虚函数,可以使类变得抽象化,只提供接口和规范。这在大型程序中非常有用,因为它可以使不同的代码模块之间保持松耦合,同时又能够保证整个程序的一致性。