📜  C++中的抽象(1)

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

C++中的抽象

在C++中,抽象是指将具体的实现细节隐藏,暴露出可供外部使用的接口。这种编程方式被称为抽象编程,也是面向对象编程的重要特性之一。

抽象类

在C++中,抽象类是一个不能直接实例化的类。抽象类可以定义纯虚函数,即没有实现的虚函数。一个类如果有纯虚函数,就是抽象类了。抽象类的作用是提供一个接口,实现类必须实现这个接口。

class Shape {
public:
    virtual double area() const = 0;
};

上面的代码定义了一个抽象类Shape,它有一个纯虚函数area()。因为它是抽象类,所以不能直接实例化。其他的类可以继承自Shape类,并实现area()函数,以提供具体的实现。

class Circle : public Shape {
public:
    Circle(double r) : radius_(r) {}
    virtual double area() const {
        return 3.14159 * radius_ * radius_;
    }
private:
    double radius_;
};

class Rectangle : public Shape {
public:
    Rectangle(double w, double h) : width_(w), height_(h) {}
    virtual double area() const {
        return width_ * height_;
    }
private:
    double width_;
    double height_;
};

上面的代码分别定义了两个类Circle和Rectangle,它们都继承了Shape类,并重写了area()函数,提供了具体的实现。

纯虚函数

纯虚函数是在抽象类中定义的没有实现的虚函数。它必须在实现类中实现,否则实现类也会变成抽象类。

class Person {
public:
    virtual void say() = 0;
};

class Employee : public Person {
public:
    virtual void say() {
        cout << "I am an employee." << endl;
    }
};

上面的代码定义了一个抽象类Person和一个实现类Employee,Employee类继承自Person类并实现了say()函数。

接口

接口是一组函数的集合,用于定义一个类或对象暴露给其他代码使用的方法。通过使用接口,可以隐藏类的实现细节,只暴露所需接口。C++中的接口通常由抽象类实现。

class IShape {
public:
    virtual double area() const = 0;
    virtual ~IShape() {}
};

class Circle : public IShape {
public:
    Circle(double r) : radius_(r) {}
    virtual double area() const {
        return 3.14159 * radius_ * radius_;
    }
private:
    double radius_;
};

class Rectangle : public IShape {
public:
    Rectangle(double w, double h) : width_(w), height_(h) {}
    virtual double area() const {
        return width_ * height_;
    }
private:
    double width_;
    double height_;
};

上面的代码定义了一个接口IShape和两个实现类Circle和Rectangle,它们分别实现了IShape接口的area()函数。其他类可以使用IShape接口,只需要调用area()函数即可。

总结

抽象是C++中的一个重要特性,它可以帮助我们隐藏实现细节,提供可供其他代码使用的接口。在C++中,抽象通常由抽象类和纯虚函数实现。使用抽象编程可以提高代码的可读性、可维护性和可扩展性。