纯虚函数和抽象类
1 目标
本文的目的是学习纯虚函数和抽象类。
2 示例代码
纯虚函数和抽象类在 C++ 中用于实现接口和多态。纯虚函数是一个没有实现的虚函数,而抽象类是包含一个或多个纯虚函数的类。抽象类不能被实例化,只能作为基类使用。
假设我们有一个抽象类 Shape,表示几何形状。该类包含一个纯虚函数 area,用于计算形状的面积。然后我们定义两个派生类 Circle 和 Rectangle,它们分别实现 Shape 类的 area 函数。
#include <iostream>
#include <cmath>
// 抽象类 Shape
class Shape {
public:
// 纯虚函数
virtual double area() const = 0;
// 虚析构函数
virtual ~Shape() {}
};
// 派生类 Circle
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
// 实现纯虚函数
double area() const override {
return M_PI * radius * radius;
}
};
// 派生类 Rectangle
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
// 实现纯虚函数
double area() const override {
return width * height;
}
};
int main() {
// 抽象类不能被实例化
// Shape shape; // 错误:不能实例化抽象类
Shape* circle = new Circle(5.0);
Shape* rectangle = new Rectangle(4.0, 6.0);
std::cout << "圆形的面积: " << circle->area() << std::endl; // 输出:圆形的面积: 78.5398
std::cout << "矩形的面积: " << rectangle->area() << std::endl; // 输出:矩形的面积: 24
delete circle;
delete rectangle;
return 0;
}
3 总结
- 抽象类 不能被实例化,只能作为基类使用。
- 纯虚函数 提供了接口的定义,但不提供实现。
- 派生类必须实现所有继承的纯虚函数,才能被实例化。
- 使用抽象类和纯虚函数,可以实现接口继承和多态,使得代码更具扩展性和灵活性。