首页 > 编程笔记

C++纯虚函数和抽象类

在 C++ 中,将虚函数声明为纯虚函数的语法格式为:
virtual 返回值类型 函数名 (函数参数) = 0;
纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。

例如:
class AbstractBase {
public:
    virtual void pureVirtualFunction() = 0; // 纯虚函数声明
};
包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。如果强行实例化抽象类,则会导致编译出错。

比如实例上 AbstractBase 类:
AbstractBase obj; //错误,AbstractBase 类中有纯虚函数,是抽象列,不能实例化

抽象类的实际应用

拥有纯虚函数的抽象类不能实例化,要实例化必须首先从抽象类派生出一个具体类,然后实例化该具体类。

下面的示例演示了如何使用纯虚函数和抽象类。
#include <iostream>

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

class Circle : public Shape {
public:
    void draw() {
        std::cout << "Drawing a circle." << std::endl;
    }
};

class Square : public Shape {
public:
    void draw() {
        std::cout << "Drawing a square." << std::endl;
    }
};

int main() {
    Circle circle;
    Square square;

    Shape* shapes[] = {&circle, &square};

    for (const auto shape : shapes) {
        shape->draw();
    }

    return 0;
}
示例中 Shape 是一个抽象类,到底要画成什么样子在 Shape 类中不能确定,因此不能给出 draw() 函数的具体实现,于是 draw() 函数声明为纯虚函数。

Circle 和 Square 类分别继承了 Shape 类并实现了 draw() 函数。main() 函数中创建了 Circle 和 Square 类的实例,并使用一个指针数组来调用它们的 draw() 函数。

运行结果为:

Drawing a circle.
Drawing a square.

这个输出演示了纯虚函数和抽象类的使用,通过定义抽象类和纯虚函数,可以创建具有统一接口的类族,同时实现多态性,使得不同派生类的对象可以通过基类指针来调用相同的接口。

总结

纯虚函数指的是没有定义(实现)的虚函数,拥有纯虚函数的类称为抽象类。

纯虚函数首先是虚函数,可以实现多态,如果某个虚函数不需要在基类中实现,或者实现也没有实际意义,可以考虑声明为纯虚函数,例如本文示例 Shape 类中的 draw() 函数。

推荐阅读