构造函数初始化列表顺序不生效?C++继承构造调用顺序解惑
#include <iostream> using namespace std; class A{ public: A(){ cout << "A "; } A(int a){ cout << "PA "; } }; class B{ public: B(){ cout << "B "; } B(int a){ cout << "PB "; } }; class C: public A, public B { public: C():B(),A(){ cout << "C "; } }; int main() { C(); return 0; }
输出:
A B C
问题
我在C++中定义了公有继承A和B的类C,其构造函数初始化列表指定为C():B(),A(),原本预期基类构造函数的调用顺序是B先于A,但实际运行输出为A B C,即按继承声明顺序调用。想请教这一行为的原因?
原因解析
这是C++标准明确规定的硬性规则:派生类中基类构造函数的调用顺序,完全由派生类声明时的基类继承顺序决定,和构造函数初始化列表里的书写顺序无关。
在你的代码里,类C的继承声明是class C: public A, public B——A被放在B的前面声明继承,所以不管你在初始化列表里写B(),A()还是A(),B(),编译器都会严格按照继承声明的顺序,先调用A的构造函数,再调用B的构造函数,最后执行C自身的构造函数体。
这样规定的核心目的是保证代码行为的一致性:
- 如果允许初始化列表改变基类构造顺序,同一个类的不同构造函数可能出现不同的基类初始化顺序,极易引发难以排查的逻辑bug。
- 继承顺序是类定义的固定部分,以此作为基类构造顺序的依据,能让代码的执行行为更可预测、更易维护。
哪怕你把C的构造函数改成:
C():A(),B(){ cout << "C "; }
输出依然是A B C,足以证明初始化列表的顺序不影响基类构造的执行顺序。
内容的提问来源于stack exchange,提问作者Hardik
相关产品推荐
相关产品推荐

