在C++中,类继承关系如下:类B和类C虚继承类A,类D继承类B和类C。D的构造函数初始化列表中显式调用了A的构造函数。执行`D *p = new D("A", "B", "C", "D");`时,各基类构造函数及派生类构造函数体的执行顺序是:
答案解析
核心考点:虚继承下的构造函数调用顺序及初始化列表的优先级。
解题思路分析:
1. 虚基类(A)的构造函数由最派生类(D)直接调用,且优先于所有非虚基类。
2. 非虚基类(B和C)的构造函数按继承声明顺序执行(B先于C)。
3. D的构造函数体最后执行。
选项分析:
- A正确:虚基类A首先初始化,接着按继承顺序B→C,最后D自身。
- B错误:虚基类A必须在所有基类前初始化,不能出现在B之后。
- C错误:A必须最先初始化,且B在C前。
- D错误:继承顺序是B在C前,而非C→B。
易错点提醒:虚基类的初始化优先级高于非虚基类,且继承声明顺序决定非虚基类的顺序,与初始化列表顺序无关。
正确答案:A