卡码笔记-最强八股文
首页
计算机基础
C++
Java
Go
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
简历专栏
代码随想录 (opens new window)
首页
计算机基础
C++
Java
Go
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
简历专栏
代码随想录 (opens new window)
  • 本栏必读

    • 关于本专栏
    • C++学习路线
    • C++面试题系优化
  • 基础与语法

  • 面向对象

    • C++构造函数有几种,分别什么作用?
    • 什么是构造函数和析构函数?构造函数和析构函数可以是虚函数吗?为什么?
      • 简要回答
      • 详细回答
      • 知识拓展
    • C++的重载和重写,以及它们的区别和实现方式
    • C++怎么实现多态
    • C++中的虚函数和纯虚函数有什么区别?
    • 虚函数怎么实现的?
    • 多重继承的优缺点及菱形继承问题
    • 如何禁止一个类被继承
    • 深拷贝和浅拷贝的区别?
    • this指针的原理
    • C++如何实现一个单例模式?
  • STL 与容器

  • 内存管理

  • C++11 与现代 C++

  • 智能指针

  • 并发与 I/O

# C++构造函数与析构函数能否为虚函数

面试官问:"构造函数和析构函数可以是虚函数吗?为什么?"

这题看着基础,但很多人只能答出"构造函数不能、析构函数可以"就卡住了,说不清背后的原因——虚表指针在什么时候建立、不用虚析构会出什么问题。

# 简要回答

构造函数不能是虚函数,因为虚函数机制依赖于已构造的虚表指针,而构造期间 vptr 尚未就绪。

析构函数可以且应该是虚函数(基类场景下),确保通过基类指针删除派生类对象时能正确调用整个析构链,避免资源泄漏。

# 详细回答

构造函数 析构函数
定义 与类同名,无返回类型,对象创建时自动调用 类名前加 ~,无参数无返回类型,对象销毁时自动调用
能否为虚函数 不能 可以,且基类应该声明为虚函数
原因 构造期间 vptr 尚未建立,虚函数调用机制不起作用 不声明为虚函数,通过基类指针 delete 派生类对象时只调用基类析构,派生类资源泄漏
调用顺序 基类 → 成员 → 派生类 派生类 → 成员 → 基类(与构造相反)
特殊情况 构造函数内调用虚函数会静态绑定到当前类版本,不会多态 纯虚析构函数可以使类成为抽象类,但必须提供实现体

总结一下:构造时 vptr 还没准备好,所以构造函数不能虚;析构时如果不虚,多态删除就会漏掉派生类的清理。

构造函数与析构函数虚函数机制

# 知识拓展

面试官可能追问:

Q1: 什么情况下必须使用虚析构函数?

当类可能被继承,且可能通过基类指针删除派生类对象时。只要你的类设计为基类,析构函数就应该是虚的。

Q2: 构造函数中调用虚函数会怎样?

技术上能编译通过,但不会多态——只会调用当前正在构造的那个类的版本,因为此时派生类部分还没构造完,vptr 指向的是当前类的虚表。

Q3: 析构函数中抛出异常会怎样?

非常危险。如果析构是在栈展开(处理另一个异常)过程中被调用的,再抛异常会直接 std::terminate,程序终止。所以析构函数里应该吞掉所有异常。

Last Updated: 5/23/2026, 4:42:31 PM

← C++构造函数有几种,分别什么作用? C++的重载和重写,以及它们的区别和实现方式 →

评论

验证登录状态...

侧边栏 侧边栏
夜间模式 夜间
卡码简历 卡码简历
代码随想录 代码随想录
卡码投递表 卡码投递表🔥
2026实习校招群 2026群
添加客服微信 2026实习校招客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记 支持卡码笔记
鼓励/支持/赞赏Carl 卡码笔记赞赏码
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪