C++继承访问限定符问题:为何子类对象无法访问成员c?
为什么
d2.c会因protected权限报错? 先看完整代码:
#include <iostream> using namespace std; class B { private: int a=1; protected: int b=2; public: int c=3; }; class D : protected B { // 条款1 }; class D2 : public D { // 条款2 void x() { c=2; } }; int main() { D d; D2 d2; cout << d2.c; // 条款3 因c为protected报错 return 0; }
核心误区纠正
你的第2条理解错误:D2以public继承D时,并不会将D中protected的成员c改为public权限。
逐条款解析权限变化
- 条款1:D以
protected方式继承B时,B的所有public、protected成员都会被继承为D的protected成员。所以B中原本public的c,在D里变成了protected属性。 - 条款2:D2以
public方式继承D时,D中的protected成员(包括c)在D2中仍然保持protected属性。只有基类的public成员在public继承下才会保持public属性,protected成员无论哪种继承方式(除private继承会变为private),在派生类中都不会提升为public。 - 条款3:
main属于类外部作用域,无法直接访问类的protected成员。d2.c试图从外部访问D2的protected成员c,因此触发编译错误。
如何让外部访问d2.c?
如果需要让外部能访问D2的c,可以在D2中显式将c声明为public:
class D2 : public D { public: using B::c; // 重新引入c并设置为public void x() { c=2; } };
内容的提问来源于stack exchange,提问作者yapkm01
相关产品推荐
相关产品推荐

