面试题答案
一键面试-
析构函数调用顺序:
- 当一个子类继承自多个父类时,析构函数的调用顺序与构造函数的调用顺序相反。即先调用子类自身的析构函数,然后按照从后往前的顺序调用各个父类的析构函数(这里的顺序是指在子类定义中继承列表里父类出现的顺序)。
-
代码实现:
#include <iostream>
class Parent1 {
public:
Parent1() {
std::cout << "Parent1 constructor" << std::endl;
}
~Parent1() {
std::cout << "Parent1 destructor" << std::endl;
}
};
class Parent2 {
public:
Parent2() {
std::cout << "Parent2 constructor" << std::endl;
}
~Parent2() {
std::cout << "Parent2 destructor" << std::endl;
}
};
class Child : public Parent1, public Parent2 {
public:
Child() {
std::cout << "Child constructor" << std::endl;
}
~Child() {
std::cout << "Child destructor" << std::endl;
}
};
int main() {
Child c;
return 0;
}
- 保证资源正确释放:
- 在每个类(包括父类和子类)的析构函数中,确保正确释放该类所管理的资源。例如,如果类中包含动态分配的内存(通过
new
运算符),则在析构函数中使用delete
运算符来释放内存。如果使用了文件句柄、网络连接等资源,在析构函数中关闭相应的资源。 - 由于析构函数调用顺序是确定的,只要每个类的析构函数正确释放自身资源,就能保证整个对象层次结构中的资源被正确释放。在上述代码中,如果
Parent1
、Parent2
和Child
类中有需要释放的资源(如动态分配的内存等),在各自的析构函数中进行释放操作即可。
- 在每个类(包括父类和子类)的析构函数中,确保正确释放该类所管理的资源。例如,如果类中包含动态分配的内存(通过