You need to enable JavaScript to run this app. C++派生类为何无法在构造函数体内调用基类受保护构造函数
优惠活动
大模型
产品
解决方案
定价
更多

C++派生类为何无法在构造函数体内调用基类受保护构造函数

两种写法的区别与权限问题解释

构造函数体内调用的错误本质

进入派生类构造函数的函数体时,当前对象的基类子对象、自身所有成员的初始化阶段已经全部完成。你在函数体中写的Transform::Transform()或__super::Transform(),并不是给当前对象已存在的基类子对象重新调用构造函数,而是尝试创建一个独立的Transform类型临时对象。

C++的protected访问权限规则明确规定:派生类仅允许访问自身继承得到的基类子对象的protected成员,无权访问其他独立Transform实例的protected成员(包括构造函数)。你尝试创建独立Transform临时对象的行为,等效于在类外部调用protected构造函数,自然会触发C2248权限错误。

初始化列表调用的合法性

派生类构造函数的初始化列表执行时机早于函数体执行,专门用于当前对象的基类子对象、自身成员的初始化工作。此时在初始化列表中写Transform(),是直接初始化当前对象自带的基类子对象,完全符合protected权限的访问规则,因此可以正常编译。


额外补充说明

你提到的“派生类没有自动调用基类构造”的问题,大概率是因为你的基类Transform的无参构造函数只有声明、没有给出具体实现。如果基类无参构造有完整定义,且你没有在派生类初始化列表指定其他基类构造重载,编译器会自动在初始化列表插入基类无参构造的调用,不需要手动编写。你之前遇到的初始化失败本质是基类构造函数缺失实现导致的问题,而非编译器没有自动调用。

内容的提问来源于stack exchange,提问作者neo-mashiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 03:09:03