C++ 给baseClass传参构造时为何构造函数被调用两次?
问题原因分析
你目前贴出的baseClass定义、main.cpp可见逻辑中,test函数仅显式创建了1个名为JACOB的baseClass对象,正常运行只会触发1次构造日志。多出来的ANONYMOUS实例必然来自你未提供代码的childClassA、childClassB相关实现,常见触发场景如下:
- 场景1:两个子类的任一实现中定义了**
baseClass类型的全局对象/类静态成员对象**,对象构造时未传入自定义名称,因此调用带默认参数的构造函数生成ANONYMOUS实例。如果输出顺序是JACOB构造日志在前、ANONYMOUS在后,更可能是类的静态成员对象,首次用到对应类时才会触发构造。 - 场景2:子类继承
baseClass时,构造函数没有在初始化列表显式调用baseClass的带参构造,编译器会自动插入baseClass的默认构造逻辑(使用默认参数ANONYMOUS)初始化基类部分。如果你的test函数中除了创建jacob对象外,还创建了子类对象,就会额外触发这次基类构造。 - 场景3:子类中定义了
baseClass类型的非静态成员变量,且没有在子类构造的初始化列表中为该成员传入自定义名称,成员初始化时会调用默认构造生成ANONYMOUS实例。
排查方法
- 先注释掉
main.cpp中#include "childClassA.h"和#include "childClassB.h"两行,重新编译运行,如果不再输出ANONYMOUS的构造日志,即可确认问题出在这两个子类的实现中。 - 逐一检查两个子类的构造函数写法、成员变量定义、全局对象定义,就能定位到额外实例的生成位置。
内容的提问来源于stack exchange,提问作者Kenneth Chen
相关产品推荐
相关产品推荐

