Software Engineer · 语言与工程基础

C++ 构造器为何不能 virtual,析构器何时应 virtual

从构造链和基类指针删除解释 virtual 的合法位置。

题目重点:从构造链和基类指针删除解释 virtual 的合法位置。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 按 C++ 对象模型说明;通过多态基类删除时讨论普通 delete,不展开定制销毁协议。

解题路线

  1. 构造器不是可重写的普通虚函数,不能声明 virtual。创建哪个完整类型必须在构造前由调用表达式或工厂决定。
  2. 构造依次完成基类与成员,再执行派生类构造体;构造/析构期间的虚调用不会分派到尚未构造或已析构的更派生部分。
  3. 若允许通过基类指针删除派生对象,基类析构应 virtual。另一种设计是禁止这种删除,例如受保护非虚析构配合受控生命周期。
  4. 需要“按配置创建子类”用工厂返回有正确销毁合同的智能指针;clone 作为普通虚方法,也不能叫虚构造器。

手动走一遍

Base 构造中调用 virtual f,行为属于当前构造阶段的 Base,不应期望 Derived 字段已初始化。unique_ptr<Base> 管理 Derived 时,普通默认删除器仍依赖 Base 的正确析构合同。

规模与取舍

构造成本来自基类、成员与资源初始化;虚析构不意味着构造复杂度改变,布局与分派开销依实现。

易错点与追问

容易失分的边界

  • 构造中调用虚函数就能访问派生对象全部状态。
  • 智能指针自动修复非虚基类析构。

继续深挖

  • 纯虚析构为什么仍需要定义?
  • 工厂返回接口时如何表示构造失败?

技术参考

✓已复制微信号!