📜  C++中的纯虚函数和抽象类(1)

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

C++中的纯虚函数和抽象类

在C++中,纯虚函数和抽象类是面向对象编程的两个重要概念。

什么是抽象类?

抽象类是具有纯虚函数的类。纯虚函数是一个没有实际实现的函数,它的实现由派生类提供。抽象类的作用是提供一个接口,用于定义一组派生类共有的方法。因为抽象类中包含纯虚函数,所以它不能被实例化,只能用于派生其他类。

class Shape {
public:
    virtual void area() = 0; // 纯虚函数
}

class Rectangle : public Shape {
public:
    void area() {
        // 求矩形面积的具体实现
    }
}

class Circle : public Shape {
public:
    void area() {
        // 求圆形面积的具体实现
    }
}

在上面的例子中,Shape是一个抽象类,它包含一个纯虚函数area(),派生类必须实现它。RectangleCircleShape的派生类,它们分别实现了area()方法。

为什么要用抽象类?

抽象类的作用是提供一个接口,用于描述一组类所具有的共同属性和行为。它可以实现多态,让不同的对象以相同的方式处理。它还可以做到程序的前后分离,提高程序的可维护性和可扩展性。

示例:图形计算器

假设我们正在开发一个图形计算器,它可以计算不同图形的面积和周长。我们可以使用抽象类来定义一组公共接口,然后派生出不同的图形类。

#include <iostream>
using namespace std;

class Shape {
public:
    virtual void print() = 0;
    virtual double area() = 0;
    virtual double perimeter() = 0;
};

class Rectangle : public Shape {
private:
    double width;
    double height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    void print() {
        cout << "Rectangle(" << width << ", " << height << ")" << endl;
    }
    double area() {
        return width * height;
    }
    double perimeter() {
        return 2 * (width + height);
    }
};

class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    void print() {
        cout << "Circle(" << radius << ")" << endl;
    }
    double area() {
        return 3.14 * radius * radius;
    }
    double perimeter() {
        return 2 * 3.14 * radius;
    }
};

int main() {
    Shape* s1 = new Rectangle(10, 20);
    Shape* s2 = new Circle(5);
    s1->print();
    cout << "Area = " << s1->area() << endl;
    cout << "Perimeter = " << s1->perimeter() << endl;
    s2->print();
    cout << "Area = " << s2->area() << endl;
    cout << "Perimeter = " << s2->perimeter() << endl;
    delete s1;
    delete s2;
    return 0;
}

在上面的示例中,我们定义了一个抽象类Shape,它包含了三个纯虚函数print()area()perimeter(),这三个函数分别用于打印图形的信息、计算图形的面积和周长。然后我们派生出RectangleCircle类,它们分别实现了这三个函数。最后我们在main()函数中创建了两个对象s1s2,然后调用它们的print()area()perimeter()方法。

总结

抽象类和纯虚函数是C++中的两个重要概念,它们可以用于定义一组类所具有的共同属性和行为。抽象类的作用是提供一个接口,用于描述这组公共属性和行为,它不能被实例化,只能用于派生其他类。纯虚函数是一个没有实际实现的函数,它的实现由派生类提供。使用抽象类和纯虚函数可以实现多态和前后分离,提高程序的可维护性和可扩展性。