C++中为何Base Constructor(基类构造函数)会被调用两次?
问题分析:基类构造函数为何被调用两次?
先拆解代码的执行逻辑:
1. 创建d1对象的正常流程
执行Derived d1;时,派生类的默认构造函数会自动调用基类的默认构造函数,用来初始化派生类对象中的基类部分,所以输出:
Base Constructor Derived Constructor
这部分完全符合预期。
2. 创建d2对象时的核心问题
执行Derived d2(d1);时,调用的是你自定义的派生类复制构造函数:
Derived(const Derived& Obj) { cout<<"Derived Copy Constructor\n"; }
这里的关键漏洞是:你没有在派生类复制构造函数的初始化列表中显式调用基类的复制构造函数。按照C++的规则,如果你没指定基类的初始化方式,编译器会自动插入基类默认构造函数的调用(也就是Base()),来初始化派生类里的基类部分。这就导致创建d2时,又触发了一次基类默认构造,所以才会输出第二次Base Constructor。
修正方案:显式调用基类复制构造函数
要得到预期输出,只需要在派生类复制构造函数的初始化列表中,手动调用基类的复制构造函数,用d1的基类部分来初始化d2的基类部分:
class Derived:public Base { public: Derived() { cout<<"Derived Constructor\n"; } // 修改后:添加基类复制构造的显式调用 Derived(const Derived& Obj) : Base(Obj) { cout<<"Derived Copy Constructor\n"; } };
修改后执行代码,输出就会和预期一致:
Base Constructor Derived Constructor Derived Copy Constructor
内容的提问来源于stack exchange,提问作者Jayesh
相关产品推荐
相关产品推荐

