C++中的纯虚函数(Pure Virtual Function)是一个特殊的虚函数,它在基类中被声明,但没有具体的实现(即函数体为空,并通常被赋值为0,即= 0)。纯虚函数的主要作用是作为一个接口,强制要求从该基类派生的任何子类都必须实现这个函数。如果一个类至少含有一个纯虚函数,那么这个类就被称为抽象类(Abstract Class)。抽象类不能被实例化,即不能创建该类的对象,但可以被用作基类来创建派生类的对象。
纯虚函数的作用
定义接口:纯虚函数提供了一种方式,允许基类定义一个接口,要求所有派生类都必须实现这个接口。
强制派生类实现:如果一个类被设计为基类,并希望派生类提供某些特定功能的具体实现,则可以将这些功能声明为纯虚函数。
禁止直接实例化:包含纯虚函数的类不能直接实例化对象,这有助于避免误用,因为抽象类通常仅用作其他类的基类。
例子
下面是一个使用纯虚函数的简单例子,展示了一个表示形状的基类(Shape),以及从这个基类派生的两个子类(Circle和Rectangle),每个子类都实现了计算面积的方法。
下面展示一些 内联代码片
。
#include <iostream>
// 抽象基类Shape
class Shape {
public:
// 纯虚函数
virtual double area() const = 0;
// 虚析构函数,允许通过基类指针删除派生类对象
virtual ~Shape() {}
};
// Circle类,继承自Shape
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
// 实现area纯虚函数
double area() const override {
return 3.14159 * radius * radius;
}
};
// Rectangle类,继承自Shape
class Rectangle : public Shape {
private:
double width, height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
// 实现area纯虚函数
double area() const override {
return width * height;
}
};
int main() {
Shape* circle = new Circle(5.0);
Shape* rectangle = new Rectangle(4.0, 6.0);
std::cout << "Circle area: " << circle->area() << std::endl;
std::cout << "Rectangle area: " << rectangle->area() << std::endl;
delete circle;
delete rectangle;
return 0;
}
在这个例子中,Shape类定义了一个纯虚函数area(),表示任何形状都应该能够计算其面积。然而,Shape类本身不提供area()的实现,因为它只是一个抽象的概念。Circle和Rectangle类都继承自Shape类,并提供了area()的具体实现,分别用于计算圆和矩形的面积。这样,通过基类指针(Shape*)可以指向不同的派生类对象,并调用其area()方法来计算面积,体现了多态性。