C++面试题更新 2026-08-05

在 C++ 中,是否必须将析构函数声明为虚函数?请说明理由及适用场景。

风险判断技术原理方案权衡C++

考察说明

考查对虚析构函数作用及多态删除机制的理解。

回答思路

  1. 【回答框架 1】析构函数不一定要是虚函数,仅在通过基类指针删除派生类对象时才需要。若基类析构非虚,delete 基类指针时只调用基类析构,派生类资源无法释放,导致未定义行为。
  2. 【回答框架 2】虚析构函数确保多态删除时按实际对象类型调用析构链,先派生类后基类。若类不用于多态基类,或对象始终以具体类型删除,则无需虚析构,避免虚表开销。
  3. 【回答框架 3】设计规则:若类包含虚函数,通常应声明虚析构;若类作为基类且可能被多态删除,必须声明虚析构。否则可保持非虚以节省空间。
  4. 【回答框架 4】析构函数本身不能是纯虚函数并定义,但可声明为纯虚析构并给出定义,使类抽象且仍可删除。
  5. 【回答框架 5】C++11 起可用 override 和 final 辅助管理,但虚析构声明仍由设计决定。
  6. 【关键点 1】仅当通过基类指针删除派生类对象时,析构函数必须为虚。
  7. 【关键点 2】非虚析构导致派生类析构不被调用,造成资源泄漏或未定义行为。
  8. 【关键点 3】含虚函数的类通常应声明虚析构,否则可非虚以省开销。
  9. 【关键点 4】纯虚析构需提供定义,否则链接错误。
  10. 【易错点 1】误以为所有类都必须虚析构,增加不必要开销。
  11. 【易错点 2】忽略基类析构非虚时多态删除的风险。
  12. 【易错点 3】将析构函数声明为纯虚但未定义,导致链接失败。