纯虚函数是一个没有实现的虚函数,其声明中使用= 0
表示,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。
virtual int A() = 0;
主要用途
- 定义接口
纯虚函数可以用来定义一个接口,强制派生类必须实现某些功能。 - 抽象类的设计
抽象类常用于描述抽象概念,具体实现由派生类完成。 - 实现多态
通过基类的纯虚函数,使用基类指针调用派生类的具体实现。
示例代码
以下是一个简单的例子,展示如何使用纯虚函数定义接口并强制派生类实现。
#include <iostream>
using namespace std;// 抽象类
class Shape {
public:// 纯虚函数,强制派生类实现virtual void draw() const = 0;virtual double area() const = 0;// 虚析构函数(推荐在抽象类中使用)virtual ~Shape() {}
};// 派生类 - 圆形
class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}// 实现纯虚函数void draw() const override {cout << "Drawing a Circle." << endl;}double area() const override {return 3.14 * radius * radius;}
};// 派生类 - 矩形
class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}// 实现纯虚函数void draw() const override {cout << "Drawing a Rectangle." << endl;}double area() const override {return width * height;}
};int main() {// 创建对象并通过基类指针调用Shape* circle = new Circle(5.0);Shape* rectangle = new Rectangle(4.0, 6.0);circle->draw();cout << "Circle Area: " << circle->area() << endl;rectangle->draw();cout << "Rectangle Area: " << rectangle->area() << endl;// 释放资源delete circle;delete rectangle;return 0;
}
输出
Drawing a Circle.
Circle Area: 78.5
Drawing a Rectangle.
Rectangle Area: 24
区别分析
- 虚函数与纯虚函数的区别
- 虚函数:可以有默认实现,派生类可以选择覆盖。
- 纯虚函数:没有实现,派生类必须实现。
- 类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖(override),这样的话,编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。
- 虚函数在子类里面可以不重写;但纯虚函数必须在子类实现才可以实例化子类。
- 虚函数的类用于 “实作继承”,继承接口的同时也继承了父类的实现。纯虚函数关注的是接口的统一性,实现由子类完成。
- 带纯虚函数的类叫抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。
- 虚基类是虚继承中的基类
- 抽象类与普通类的区别
- 抽象类:包含至少一个纯虚函数,不能直接实例化。
- 普通类:可以直接实例化,没有纯虚函数。