为什么public继承的子类可公开访问父类的protected operator=()?
解答:为什么public继承的子类能“公开调用”父类的protected赋值运算符?
嘿,这个问题其实是对C++继承访问规则和编译器默认合成函数的小误解,咱们一步步拆解清楚:
核心真相:你并没有直接调用父类的protected operator=
你的代码里a = b这行,不是直接调用父类A的protected赋值运算符,而是调用了编译器为子类B自动合成的public版本的operator=。这个合成函数会帮你完成子类成员的赋值,同时调用父类的protected operator=来处理基类部分的成员——这完全符合C++的访问规则。
具体规则拆解
- 子类默认合成的
operator=的访问权限:当子类没有显式定义赋值运算符时,编译器会自动生成一个public的版本(前提是基类的赋值运算符对子类来说是可访问的)。这个合成函数的职责就是逐个赋值成员变量,包括调用基类的赋值运算符处理基类部分。 - protected成员的访问规则:基类的protected成员,允许子类的成员函数(包括编译器合成的成员函数)和子类的友元访问。B的合成
operator=属于B的成员函数,所以它完全有权调用父类A的protectedoperator=。 - 验证:外部代码无法直接访问父类的protected
operator=
你可以在main里加一行测试代码:
这时候编译器会直接报错,提示a = static_cast<A&>(b); // 强制尝试调用A的operator=A& A::operator=(const A&)是protected的,不能被main函数(外部代码)访问——这就证明了父类的protected成员并没有被公开,只是子类的合成函数帮你封装了调用逻辑。
总结
你看到的“可公开访问”,本质是子类的public合成赋值运算符对外提供了赋值能力,而这个合成函数内部合法地调用了父类的protected成员,完全符合C++的访问控制设计。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

