纯虚函数是一种特殊的虚函数,在某些情况下,基类中不能对虚函数给出有意义的实现,把它声明为纯虚函数。
纯虚函数只有函数名、参数和返回值类型,没有函数体,具体实现留给该派生类去做。
语法:virtual 返回值类型 函数名 (参数列表)=0;
纯虚函数在基类中为派生类保留一个函数的名字,以便派生类它进行重定义。如果在基类中没有保留函数名字,则无法支持多态性。
含有纯虚函数的类被称为抽象类,不能实例化对象,可以创建指针和引用。
派生类必须重定义抽象类中的纯虚函数,否则也属于抽象类。
基类中的纯虚析构函数也需要实现。
有时候,想使一个类成为抽象类,但刚好又没有任何纯虚函数,怎么办?
方法很简单:在想要成为抽象类的类中声明一个纯虚析构函数。
下面是一个C++示例代码,展示了纯虚函数和抽象类的用法
#include <iostream>
using namespace std;
// 抽象基类
class Shape {
public:
// 纯虚函数
virtual void draw() const = 0;
// 纯虚析构函数
virtual ~Shape() = 0;
};
// 纯虚析构函数的定义
Shape::~Shape() {
cout << "Shape destructor called" << endl;
}
// 派生类 - 圆形
class Circle : public Shape {
public:
void draw() const override {
cout << "Drawing Circle" << endl;
}
~Circle() {
cout << "Circle destructor called" << endl;
}
};
// 派生类 - 矩形
class Rectangle : public Shape {
public:
void draw() const override {
cout << "Drawing Rectangle" << endl;
}
~Rectangle() {
cout << "Rectangle destructor called" << endl;
}
};
int main() {
Shape* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->draw();
shape2->draw();
delete shape1;
delete shape2;
return 0;
}
在这个示例中:
Shape
类是一个抽象基类,包含一个纯虚函数draw()
和一个纯虚析构函数。Circle
和Rectangle
类是从Shape
类派生出来的,并实现了draw()
纯虚函数。- 在
main
函数中,创建了Shape
类的指针shape1
和shape2
,分别指向Circle
和Rectangle
对象。通过多态性,调用了派生类的draw()
函数。 - 最后,通过
delete
操作符,调用了析构函数,确保了资源的正确释放。
这样,通过声明纯虚函数,Shape
类成为一个抽象类,不能被实例化,但可以用于派生类对象的指针和引用。