# 什么是构造函数和析构函数?构造函数和析构函数可以是虚函数吗?为什么?
# 简要回答
构造函数是用于初始化对象的特殊成员函数,析构函数是用于清理资源的特殊成员函数。
析构函数可以是虚函数(通常基类析构函数应为虚函数),而构造函数不能是虚函数,因为虚函数机制依赖于已构造的虚表指针。
# 详细回答
- 构造函数
与类同名,无返回类型的特殊成员函数
在对象创建时自动调用,用于初始化对象状态
可以重载(多个不同参数的构造函数)
构造函数不能被声明为虚函数
因为构造期间虚表指针尚没有完全建立,而虚函数调用需要通过虚表,而构造期间这个机制不起作用
- 析构函数
类名前加上~,无参数返回类型的特殊成员函数
在对象销毁时自动调用,用于释放资源
析构函数可以声明为虚函数(特别是基类析构函数)
确保通过基类指针删除派生类对象时调用正确的析构函数链,避免资源泄漏和未定义行为
如果不是虚函数,通过基类指针删除派生类对象会导致派生类部分未被正确销毁
# 代码示例
#include <iostream>
using namespace std;
class Base {
public:
Base() { cout << "Base构造函数" << endl; }
virtual ~Base() { cout << "Base析构函数" << endl; } // 虚析构函数
};
class Derived : public Base {
public:
Derived() { cout << "Derived构造函数" << endl; }
~Derived() override { cout << "Derived析构函数" << endl; }
};
int main() {
Base* obj = new Derived(); // 通过基类指针创建派生类对象
delete obj; // 正确调用派生类和基类的析构函数
// 如果Base析构函数不是虚函数,则只会调用Base的析构函数
// 导致Derived部分的资源泄漏
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 知识拓展
试试图解

构造和析构的顺序:
构造: 基类 → 成员 → 派生类
析构:派生类 → 成员 → 基类
- 纯虚析构函数: 可以使类变成抽象类,但是必须提供实现
class Abstract {
public:
virtual ~Abstract() = 0;
};
Abstract::~Abstract() {} // 必须实现
1
2
3
4
5
2
3
4
5
- 面试官可能追问
什么情况下必须使用虚析构函数?
当类可能被继承,且可能通过基类指针删除派生类对象时
构造函数中可以调用虚函数吗?
技术上可以,但会静态绑定到当前类的实现,但是通常不这么做
析构函数中抛出异常会怎样?
非常危险,可能导致程序终止,应避免
评论
验证登录状态...