在 C++ 面向对象编程中,纯虚函数是一个非常重要的概念。它不仅帮助我们实现接口设计,还能强制派生类实现特定功能。本文将从基础讲起,用通俗易懂的语言带你彻底掌握 C++纯虚函数、抽象类以及它们在 C++面向对象编程中的作用。
纯虚函数是一种特殊的虚函数,它在基类中没有具体实现,而是要求所有派生类必须提供自己的实现。定义纯虚函数的方式是在函数声明后加上 = 0。
语法如下:
class Base {public: virtual void func() = 0; // 纯虚函数};注意:virtual 关键字不能省略,= 0 并不是赋值,而是一种语法标记,表示这是一个纯虚函数。
想象一下:你正在设计一个图形系统,有圆形、矩形、三角形等不同形状。你希望每个形状都能“绘制自己”,但基类(比如 Shape)本身并不知道如何绘制——因为“形状”是个抽象概念。
这时,你就需要在基类中定义一个纯虚函数,让所有具体形状类去实现它。

只要一个类包含至少一个纯虚函数,这个类就称为抽象类。抽象类有以下特点:
来看一个完整例子:
#include <iostream>using namespace std;// 抽象基类class Shape {public: // 纯虚函数 virtual void draw() = 0; // 普通虚函数(可选) virtual ~Shape() {}};// 派生类:Circleclass Circle : public Shape {public: void draw() override { cout << "绘制一个圆形" << endl; }};// 派生类:Rectangleclass Rectangle : public Shape {public: void draw() override { cout << "绘制一个矩形" << endl; }};int main() { // Shape s; // ❌ 错误!不能实例化抽象类 Shape* shapes[2]; shapes[0] = new Circle(); shapes[1] = new Rectangle(); for (int i = 0; i < 2; ++i) { shapes[i]->draw(); // 多态调用 } // 清理内存 delete shapes[0]; delete shapes[1]; return 0;}输出结果:
绘制一个圆形绘制一个矩形
在底层,C++ 使用虚函数表(virtual table,简称 vtable)来实现多态。每个包含虚函数的类都有一个 vtable,其中存储了指向虚函数的指针。
对于纯虚函数,vtable 中对应的条目通常指向一个特殊函数(如 __pure_virtual_called),如果程序试图调用未被重写的纯虚函数,就会崩溃或抛出错误。
这也是为什么派生类必须实现所有纯虚函数才能被实例化——否则它的 vtable 仍包含无效入口。
class Base {public: virtual void foo() = 0;};// 在类外定义纯虚函数的实现void Base::foo() { cout << "Base::foo() called" << endl;}class Derived : public Base {public: void foo() override { Base::foo(); // 可以显式调用基类实现 cout << "Derived::foo()" << endl; }};通过本文,你应该已经掌握了:
纯虚函数是构建灵活、可扩展系统的关键工具。合理使用它,能让你的代码更符合“开闭原则”——对扩展开放,对修改关闭。
现在,试着自己写一个动物类(Animal),定义纯虚函数 makeSound(),然后派生出 Dog、Cat 等类并实现它吧!
本文由主机测评网于2025-12-27发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251213016.html