纯虚函数必须写为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;。
关键点:
virtual ~Base() = 0; // 声明
Base::~Base() {} // 必须在类外定义,否则链接失败
所谓“接口类”,就是所有成员函数都是 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,派生类无法重写clas
s Button : public Drawable, public Clickable
这是容易忽略的陷阱:只要有一个纯虚函数没被重写(哪怕只漏一个),派生类就还是抽象类,无法实例化。
检查方法:
cannot declare variable 'x' because the following virtual functions are pure,说明漏实现了某个纯虚函数override 关键字能帮助捕获拼写错误或签名不匹配(如参数类型、const 限定符不一致)virtual void func() = 0;,但这会延续抽象性纯虚函数的核心约束很硬:语法上必须 = 0,语义上强制派生类响应。它不提供多态的“便利”,而是划定契约的边界——漏掉一个 override,整个对象就立不起来。