面试题答案
一键面试代码如下:
#include <iostream>
class Base {
public:
Base() {
std::cout << "Base constructor called." << std::endl;
}
~Base() {
std::cout << "Base destructor called." << std::endl;
}
};
class Derived : public Base {
public:
Derived() {
std::cout << "Derived constructor called." << std::endl;
}
~Derived() {
std::cout << "Derived destructor called." << std::endl;
}
};
在 main
函数中使用 Derived
类:
int main() {
Derived d;
return 0;
}
析构函数调用顺序:
当 Derived
类对象被销毁时,析构函数的调用顺序是先调用 Derived
类的析构函数,再调用 Base
类的析构函数。这是因为在对象销毁时,构造的逆过程被执行。Derived
对象构造时先调用 Base
的构造函数,然后才是 Derived
自身的构造函数,所以销毁时先 Derived
析构,再 Base
析构。
利用GDB验证调用顺序:
- 编译带有调试信息的程序:
使用
g++ -g
选项编译上述代码,例如:g++ -g -o test test.cpp
。 - 启动GDB:
运行
gdb test
进入GDB调试环境。 - 设置断点:
在
Base
和Derived
的析构函数处设置断点。例如:(gdb) b ~Base (gdb) b ~Derived
- 运行程序:
使用
run
命令运行程序:(gdb) run
。 - 观察断点命中顺序:
当程序执行到对象销毁时,GDB会停在
Derived
类的析构函数断点处,此时输出信息为Derived destructor called.
。继续执行(使用continue
命令),GDB会停在Base
类的析构函数断点处,输出信息为Base destructor called.
。这就验证了析构函数的调用顺序。