C++继承类实例化时,父类构造函数为何会被调用?
为什么创建C类实例时A和B的构造函数会被调用?
先看你提供的代码:
#include <iostream> class A { public: A() { std::cout << "A's constructor called\n"; } }; class B { public: B() { std::cout << "B's constructor called\n"; } }; class C: public B, public A // Note the order { public: C() { std::cout << "C's constructor called\n"; } }; int main() { C c; return 0; }
运行后输出:
B's constructor called A's constructor called C's constructor called
这背后是C++继承机制的核心规则:派生类对象的构造必须先完成所有直接基类的初始化,具体细节如下:
- 当你创建派生类
C的实例时,编译器会自动触发基类的构造流程,而且调用顺序严格遵循你在派生类声明时指定的基类顺序(也就是class C: public B, public A里的B在前、A在后),和派生类构造函数的初始化列表顺序无关(这里C的构造函数没写初始化列表,所以调用基类的默认构造函数)。 - 只有当所有基类的构造都完成后,才会执行派生类自身构造函数里的逻辑。
放到你的代码场景里,执行顺序就是:
- 声明
C c;触发C的构造流程 - 先调用基类
B的默认构造函数,输出对应的日志 - 接着调用基类
A的默认构造函数,输出对应的日志 - 最后执行
C自己构造函数中的代码,输出日志
这个规则的意义在于确保基类的成员变量能在派生类使用它们之前就完成初始化,避免出现未定义行为。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

