纯虚析构函数(C++)
一个纯虚析构函数Pure Virtual Destructor。代码cppvirtual ~Product() 0; // 虚函数这样写的目的让Product成为一个抽象基类不能实例化同时又需要确保派生类对象被正确析构。一、为什么析构函数要写成虚函数先回答“虚”的部分如果基类的析构函数不是虚函数当通过基类指针删除派生类对象时只会调用基类的析构函数派生类的析构函数不会被调用导致派生类资源泄漏。cppBase *p new Derived(); delete p; // 如果Base析构不是虚函数Derived的析构不会被调用 ❌所以基类析构函数必须声明为virtual。二、为什么写成 0纯虚 0让析构函数变成纯虚函数效果是Product变成抽象类不能创建对象Product p;编译报错。但仍然必须实现这个析构函数没错纯虚析构函数必须有函数体。三、纯虚析构函数的特殊规则普通纯虚函数可以只有声明没有实现派生类必须重写。但析构函数不同编译器在析构派生类对象时最终会自动调用基类的析构函数。所以即使是纯虚析构函数也必须提供实现。正确的写法必须是cpp// Product.h class Product { public: Product() {} virtual ~Product() 0; // 声明为纯虚 }; // Product.cpp Product::~Product() {} // 必须有函数体四、完整示例说明cpp#include iostream using namespace std; class Product { public: Product() { cout Product构造 endl; } virtual ~Product() 0; // 纯虚析构 }; Product::~Product() { // 必须实现 cout Product析构 endl; } class Book : public Product { public: Book() { cout Book构造 endl; } ~Book() { cout Book析构 endl; } }; int main() { Product *p new Book(); delete p; // 输出Book析构 - Product析构 ✅ return 0; }输出textProduct构造 Book构造 Book析构 Product析构五、对比其他写法写法是否抽象类能否实例化派生类析构是否安全是否需要实现~Product() {}❌ 否✅ 能✅ 安全虚函数需要virtual ~Product() {}❌ 否✅ 能✅ 安全需要virtual ~Product() 0; 实现✅ 是❌ 不能✅ 安全必须实现~Product() 0;无实现✅ 是❌ 不能❌ 链接错误缺实现会报错六、什么时候这样写典型场景你需要一个抽象基类定义接口比如工厂模式中的Product同时这个基类需要做一些通用的清理工作并且必须确保派生类的析构函数被正确调用。cpp// 工厂模式中的抽象产品 class Product { public: virtual void use() 0; // 纯虚接口 virtual ~Product() 0; // 保证派生类正确析构 抽象类 }; Product::~Product() {} // 基类清理逻辑七、一句话总结virtual ~Product() 0;的意思让Product成为抽象类不能实例化同时确保通过基类指针删除派生类对象时能正确调用派生类和基类的析构函数。记住纯虚析构函数必须在类外提供实现。如果你看到的是virtual ~Product() {}没有 0那它只是一个普通的虚析构函数Product可以实例化不是抽象类。