纯虚函数必须写=0,否则是普通虚函数;含纯虚函数的类为抽象类,不可实例化;派生类须实现所有纯虚函数才能实例化;抽象类析构函数必须为虚函数且需提供定义。

纯虚函数必须写 =0,不能只加 virtual
很多人误以为只要加了 virtual 就是纯虚函数,结果编译通过但类还能实例化——那其实是普通虚函数。纯虚函数的语法强制要求在声明末尾写 =0,这是唯一标识。比如:virtual void draw() = 0; 是纯虚函数;而 virtual void draw(); 或 virtual void draw() {} 都不是,哪怕函数体为空。
含纯虚函数的类自动成为抽象类,无法 new 或定义栈对象
只要类里有一个 =0 的函数,这个类就是抽象类。你不能写 Shape s; 或 new Shape;,编译器会报错:error: cannot declare variable 's' to be of abstract type 'Shape'。这不是警告,是硬性限制。抽象类只用来被继承,它的价值体现在指针或引用上,比如:Shape* p = new Circle; 才是合法用法。
派生类没实现所有纯虚函数,它还是抽象类
如果基类有两个纯虚函数 area() 和 perimeter(),派生类只重写了 area(),那这个派生类依然不能实例化。常见错误是只改了一个函数就以为搞定了。检查方法很简单:尝试定义一个该派生类的变量,编译失败就说明还有纯虚函数没覆盖。列表式确认更可靠:
- 逐个对照基类中所有
virtual ... = 0声明 - 确保派生类中函数签名(返回类型、函数名、参数列表、
const修饰)完全一致 - 推荐加上
override关键字,让编译器帮你校验是否真重写了
抽象类的析构函数必须是虚的,否则有内存泄漏风险
这是最容易被跳过的细节。如果你用 Base* p = new Derived;,然后 delete p;,而 Base::~Base() 不是虚函数,C++ 只会调用 Base 的析构,Derived 的析构根本不会执行。解决办法是显式声明虚析构:virtual ~Base() = default; 或 virtual ~Base() {}。注意:=0 不适合析构函数——纯虚析构函数必须提供实现,哪怕空着,否则链接失败。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











