MST

星途 面试题库

面试题:C++构造函数调用顺序调试技巧之继承体系下的调试

考虑以下C++代码的继承体系: ```cpp class Base1 { public: Base1() { std::cout << "Base1 constructor" << std::endl; } }; class Base2 { public: Base2() { std::cout << "Base2 constructor" << std::endl; } }; class Derived : public Base1, public Base2 { public: Derived() { std::cout << "Derived constructor" << std::endl; } }; ``` 1. 请指出 `Derived d;` 执行时构造函数的调用顺序。 2. 若要通过调试来验证该调用顺序,并且要获取详细的调用栈信息,在使用GDB调试器时,你会使用哪些命令逐步跟踪构造函数的调用过程?
14.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 构造函数调用顺序:

    • Base1 constructor
    • Base2 constructor
    • Derived constructor 原因是在C++中,派生类构造函数在执行自身构造函数体之前,会先调用其基类的构造函数,调用顺序是按照基类在派生类定义中声明的顺序。
  2. 使用GDB调试器逐步跟踪构造函数调用过程的命令:

    • gdb <可执行文件名>:启动GDB调试器并加载可执行文件。
    • break Derived::Derived:在Derived类的构造函数处设置断点。
    • run:运行程序,程序会在Derived类的构造函数处停下。
    • up:用于向上移动栈帧,可以观察到Derived构造函数调用之前调用的基类构造函数。例如,通过多次执行up命令,可以依次看到Base2Base1构造函数的调用栈信息。
    • bt:打印当前的调用栈信息,这样可以直观地看到构造函数的调用顺序。