在C++中,纯虚函数是一种特殊类型的虚函数,它在基类中没有定义具体的实现。它的主要目的是强制派生类提供特定的实现。纯虚函数的声明以= 0
结尾,表示它是一个纯虚函数。
当我们创建一个包含至少一个纯虚函数的类时,这个类被称为抽象类。抽象类不能被实例化,也就是说,我们不能创建抽象类的对象。抽象类的主要作用是作为基类,为派生类提供一个共同的接口和一些通用的功能。
纯虚函数的主要用途是实现多态。多态是指允许不同类的对象对同一消息做出响应。通过将相同的函数调用应用于不同的对象,我们可以根据对象的实际类型来执行不同的操作。纯虚函数使得我们可以将一组具有相同接口但实现不同的类归为一个基类,从而实现多态。
以下是一个简单的纯虚函数示例:
#include <iostream>
// 抽象类 Shape
class Shape {
public:
// 构造函数
Shape() {
std::cout << "Shape 构造函数被调用" << std::endl;
}
// 虚析构函数
virtual ~Shape() {
std::cout << "Shape 析构函数被调用" << std::endl;
}
// 纯虚函数 area()
virtual double area() const = 0;
};
// 派生类 Circle
class Circle : public Shape {
public:
// 构造函数
Circle(double radius) : radius_(radius) {
std::cout << "Circle 构造函数被调用" << std::endl;
}
// 析构函数
~Circle() {
std::cout << "Circle 析构函数被调用" << std::endl;
}
// 实现纯虚函数 area()
double area() const override {
return 3.14 * radius_ * radius_;
}
private:
double radius_;
};
// 派生类 Rectangle
class Rectangle : public Shape {
public:
// 构造函数
Rectangle(double width, double height) : width_(width), height_(height) {
std::cout << "Rectangle 构造函数被调用" << std::endl;
}
// 析构函数
~Rectangle() {
std::cout << "Rectangle 析构函数被调用" << std::endl;
}
// 实现纯虚函数 area()
double area() const override {
return width_ * height_;
}
private:
double width_;
double height_;
};
int main() {
// 由于 Shape 是抽象类,我们不能创建它的对象
// Shape shape; // 错误
// 创建一个指向派生类对象的指针,指向基类
Shape* shape = new Circle(5.0);
std::cout << "面积: " << shape->area() << std::endl;
delete shape; // 调用派生类的析构函数
shape = new Rectangle(4.0, 6.0);
std::cout << "面积: " << shape->area() << std::endl;
delete shape; // 调用派生类的析构函数
return 0;
}
在这个示例中,我们定义了一个抽象类Shape
,它包含一个纯虚函数area()
。然后,我们创建了两个派生类Circle
和Rectangle
,它们分别表示圆形和矩形,并实现了area()
函数。在main()
函数中,我们使用基类指针指向派生类对象,并通过基类指针调用area()
函数,实现了多态。