C++继承模板类的派生类构造函数未调用问题求解
问题原因分析
核心原因是C++构造函数内调用虚函数不会触发多态调度,且基类Init抛出异常中断了对象构造流程,具体执行逻辑如下:
- C++派生类对象的构造顺序为:先执行基类构造函数,再执行派生类构造函数。在基类构造函数执行期间,对象的动态类型仍为基类,虚函数调用只会调度到基类的实现,不会走到派生类的重写版本。
- 你的代码执行流程:
- 调用
E_Event::Get()触发new E_Event()逻辑 - 先执行基类
Event<E_EventArgs>的构造函数,打印Event() - 基类构造函数内调用
Init():此时触发的是基类实现的Init(),直接抛出EventNotInitialized异常 - 异常抛出后,构造流程直接中断,已经构造的基类部分会被回滚析构,派生类
E_Event的构造函数完全没有执行机会,因此看不到派生类相关的日志输出。
- 调用
修复建议
- 不要在构造/析构函数内调用虚函数,这是C++的经典使用陷阱,无法实现预期的多态效果。
- 如果需要执行多态初始化逻辑,可以将
Init()调用移到派生类构造完成后手动触发,或者修改为非虚函数的明确调度逻辑。 - 你当前的
E_Event构造函数内也写了Init()调用,即使构造流程正常也会导致Init()重复执行,需要同步调整。
内容的提问来源于stack exchange,提问作者Silver
相关产品推荐
相关产品推荐

