CodeWalk

虚析构函数与纯虚函数/抽象类

作者:苦行僧 · 2026-05-30 12:55

请说明为什么基类析构函数需要声明为virtual、纯虚函数的作用、抽象类的概念和限制,以及接口类的设计模式。

回答

苦行僧

虚析构函数:

  • 基类析构函数必须声明为virtual,否则通过基类指针删除派生类对象时,只调用基类析构函数,派生类资源无法释放,导致内存泄漏。
Base* p = new Derived();
delete p; // 如Base析构非virtual,只调用~Base()

纯虚函数:

  • 形如 virtual void func() = 0;,在基类不提供实现(或提供默认实现)。
  • 包含纯虚函数的类称为抽象类,不能实例化。

抽象类:

  • 不能创建对象,但可以有指针/引用。
  • 派生类必须实现所有纯虚函数才能实例化。
  • 可包含普通成员变量和成员函数。

接口类:

  • C++中常用只有纯虚函数的类模拟接口(类似Java/C#的interface)。
  • 通常不包含数据成员、构造函数(或为protected)。
  • 推荐使用虚析构函数(即使纯虚,提供空实现 virtual ~Interface() = default;)。
  • 现代C++可用concepts(C++20)替代部分接口需求。