纯虚函数是C++中声明接口规范的成员函数,语法为virtual返回类型函数名(参数列表)=0,强制派生类重写;含纯虚函数的类为抽象类,不可实例化,但可被继承和多态调用。

纯虚函数是 C++ 中用于定义接口规范的特殊成员函数,它没有实现体(函数体),只在基类中声明为 = 0,强制派生类必须重写该函数;含有至少一个纯虚函数的类就是抽象类,不能实例化对象,但可作为接口被继承和实现。
纯虚函数:接口契约的声明方式
纯虚函数本质是“只承诺、不实现”的函数声明,语法为:virtual 返回类型 函数名(参数列表) = 0;。它不提供具体逻辑,仅规定“子类必须提供这个功能”。例如:
- virtual void draw() = 0; 表示“任何图形都得能画,但怎么画由子类决定”
- 一旦类中出现该声明,该类立即成为抽象类,无法直接 new 对象
- 纯虚函数可以有声明,但不能有定义(除非显式提供 inline 实现,但极少用)
抽象类:不能创建对象的“模板基类”
抽象类是面向对象中实现运行时多态的关键载体。它的核心特征包括:
- 至少含一个纯虚函数(也可包含普通成员函数、数据成员、构造/析构函数)
- 不能定义该类的对象(如 Shape s; 是编译错误),但可以定义指针或引用(Shape* p = new Circle; 合法)
- 派生类若未实现全部纯虚函数,自身仍是抽象类,继续禁止实例化
接口实现:通过继承+重写达成多态行为
C++ 没有像 Java 那样的 interface 关键字,但用“只含纯虚函数的抽象类”即可模拟接口。典型做法是:
立即学习“C++免费学习笔记(深入)”;
- 定义一个全纯虚函数的类(如 class Drawable { virtual void draw() = 0; virtual void hide() = 0; };)
- 多个无关类(如 Button、Text、Image)各自继承并实现这些函数,形成统一行为契约
- 上层代码只需依赖 Drawable*,调用 draw() 时自动绑定到实际对象的具体实现(动态绑定)
关键细节与常见误区
理解纯虚函数和抽象类需注意几个易错点:
- 纯虚函数可以有默认实现(在基类中定义函数体),但调用需显式通过作用域(Base::func();),派生类仍需重写才能被多态调用
- 析构函数建议声明为 virtual(尤其当类设计为基类时),即使它是纯虚的(virtual ~Base() = 0;),且必须提供定义(否则链接失败)
- 纯虚函数不能是 static、friend 或构造函数;但可以是 const 成员函数(如 virtual int getID() const = 0;)











