C++ - 纯虚函数和抽象类
纯虚函数和抽象类
纯虚函数是 C++ 中的虚函数,我们无需为其编写任何函数定义,只需声明即可,声明时只需在声明中赋值 0 即可。要声明虚函数,请使用"virtual"关键字。
然而,抽象类是 C++ 中至少包含一个纯虚函数的类。
语法
virtual return_type func_name(parameters) = 0;
其中
- return_type 是函数的返回类型(例如,int、void 等)
- func_name 是函数的名称。
- parameters 是函数的参数列表。
- = 0 语法表示该函数是纯虚函数,在基类中没有定义。
纯虚函数示例
class Shape {public: // 纯虚函数 virtual void draw() = 0; };
抽象类示例
抽象类是包含至少一个纯虚函数的类。
class Shape {public: virtual void draw() = 0; // 纯虚函数使 Shape 成为抽象类 virtual ~Shape() {} // 虚析构函数(良好实践) };
纯虚函数和抽象类示例
以下是展示其工作原理的完整示例。
#include<iostream> using namespace std; // 抽象类 class Shape { public: virtual void draw() = 0; // 纯虚函数 virtual~Shape() {} // 虚析构函数 }; // 派生类:圆形 class Circle: public Shape { public: void draw() override { cout << "Drawing Circle" << endl; } }; // 派生类:矩形 class Rectangle: public Shape { public: void draw() override { cout << "Drawing Rectangle" << endl; } }; // 派生类:三角形 class Triangle: public Shape { public: void draw() override { cout << "Drawing Triangle" << endl; } }; int main() { Shape * shapes[] = { new Circle(), new Rectangle(), new Triangle() }; // 绘制所有形状 for (Shape * shape: shapes) { shape -> draw(); } // 清理 for (Shape * shape: shapes) { delete shape; } return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Drawing Circle
Drawing Rectangle
Drawing Triangle
抽象类的主要特性
- 抽象类可以包含普通的函数和变量,以及一个纯虚函数。
- 抽象类无法实例化,但可以创建抽象类类型的指针和引用。
- 抽象类主要用于向上转型,以便其派生类可以使用其接口。
- 如果抽象类有派生类,则该派生类必须实现所有纯虚函数,否则这些纯虚函数也会变为抽象类。
- 我们无法创建抽象类的对象,因为我们在虚函数表中为纯虚函数预留了一个位置,但没有填写任何地址,因此虚函数表将保持不完整。