纯虚函数必须写为virtual void func() = 0;它不允函数体,标记抽象类,派生类须全部实现否则仍为抽象类。

纯虚函数的写法必须带 = 0
纯虚函数不是“没实现的虚函数”,而是语法上明确用 = 0 标记的成员函数。它不分配函数体,也不允许在类内定义(哪怕空实现)。编译器靠这个标记识别抽象类。
常见错误包括:
- 写成
virtual void func() = 0;✅ 正确 - 写成
virtual void func() { }❌ 这是普通虚函数,类仍可实例化 - 写成
virtual void func() = 0 {}❌ 语法错误,= 0和函数体不能共存 - 在类外定义纯虚函数(如
void Base::func() = 0;)❌ C++ 不允许,链接会失败
抽象类无法实例化,但可以声明指针或引用
只要一个类含至少一个纯虚函数,它就是抽象类。你不能写 Base obj;,但可以写 Base* p = new Derived(); 或 Base& ref = derived_obj;。
关键点:
立即学习“C++免费学习笔记(深入)”;
- 抽象类常作为接口基类,强制派生类实现关键行为
- 析构函数若为虚函数(推荐),也建议设为纯虚——但需提供定义:
virtual ~Base() = 0; // 声明
Base::~Base() {} // 必须在类外定义,否则链接失败 - 抽象类可含普通成员变量、非纯虚函数、静态成员,和普通类一样
C++ 没有 interface 关键字,但可通过纯虚类模拟接口
所谓“接口类”,就是所有成员函数都是 public 纯虚函数、无数据成员、无构造函数实现的抽象类。它接近 Java/C# 的 interface 语义。
典型写法:
class Drawable {
public:
virtual ~Drawable() = 0;
virtual void draw() const = 0;
virtual void resize(float scale) = 0;
};
Drawable::~Drawable() = default;注意:
- 不加
public:会导致默认 private,派生类无法重写 - 接口类通常不提供构造逻辑,所以构造函数应为 protected 或 default
- 多个接口类可通过多重继承组合,比如
class Button : public Drawable, public Clickable
派生类未实现全部纯虚函数,仍是抽象类
这是容易忽略的陷阱:只要有一个纯虚函数没被重写(哪怕只漏一个),派生类就还是抽象类,无法实例化。
检查方法:
- 编译时若报错
cannot declare variable 'x' because the following virtual functions are pure,说明漏实现了某个纯虚函数 - 使用
override关键字能帮助捕获拼写错误或签名不匹配(如参数类型、const 限定符不一致) - 如果想让派生类“转发”某个纯虚函数而不实现,可以再声明一次
virtual void func() = 0;,但这会延续抽象性
纯虚函数的核心约束很硬:语法上必须 = 0,语义上强制派生类响应。它不提供多态的“便利”,而是划定契约的边界——漏掉一个 override,整个对象就立不起来。











