Access declaration of a protected member of base class as public in derived class C++
在基类中声明受保护的成员并在派生类中继承为私有成员时,不允许访问该成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class base{ protected: int a; }; class derived : public base { protected: int b; public: derived():base(){ a=0; b=0;} void show(){cout<<"a="<<a<<"\tb="<<b;} }; int main () { derived d; d.a=10; //error: 'int base::a' is protected within this context d.show(); } |
但当我编写派生类时,要为"a"(在基中受保护)授予公共访问权限
1 2 3 4 5 6 7 8 9 10 11 12 13 | class derived : public base { protected: int b; public: base::a; }; int main () { derived d; d.a=20; // no error } |
号
现在,我可以在main()中更改"a"的值,而不会出现任何错误。
我在C++中阅读完整的参考书,授予访问权限将恢复访问权限,但不能提高或降低访问状态。
有人能告诉我为什么我能访问基类的受保护成员,私下继承,然后像派生类的公共变量那样被授予公共访问权限(它不违反封装吗,即受保护的成员应该还原为受保护的成员)。如果我的理解不正确,请指导我
当
你甚至可以用一个正常的函数来做,毕竟:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class base { protected: int a; }; class derived : public base { protected: int b; public: int& GotYou() { return a; } }; int main () { derived d; d.GotYou() = 20; // no error } |
如果需要保护,请使用
顺便说一下,下面的一行可能给你一个错误的印象,C++是如何工作的:
1 | derived():base(){ a=0; b=0;} |
号
这里所发生的是构造
以下链接将帮助您:
私有继承、公共继承和受保护继承之间的差异
http://www.geeksforgeks.org/inheritance-in-c/