当我声明一个受基类保护的成员并在派生类中继承为private时,不允许访问该成员
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'授予公共访问权限(在base中受保护)
class derived : public base
{
protected:
int b;
public:
base::a;
};
int main ()
{
derived d;
d.a=20; // no error
}
现在我可以在main()中更改'a'的值而不会出现任何错误 .
我在c阅读完整的参考书,授予访问权限将恢复访问权限,但不能提升或降低访问状态 .
任何人都可以告诉我为什么我能够访问基类的受保护成员,私有继承,然后给予公共访问,如派生类的公共变量(它不违反封装,即受保护的成员应该恢复为受保护的) . 如果我的理解不正确,请指导我
2 回答
protected
没有多少保护;距离public
不远 .现在
base
说a
是protected
,现在's fate is sealed - it'现在几乎对世界其他地方开放了 . 您所要做的就是创建一个派生类,访问成员变量并向外界公开 - 这是您在编写base::a
时所做的derived
(顺便说一句,您通常在此之前添加using
) .毕竟,你甚至可以用正常的功能做到这一点:
If you want protection, use private.
顺便说一句,以下行可能会给你一个关于C如何工作的错误印象:
这里发生的是构造
base
,a
默认初始化为不确定值,然后b
默认初始化为不确定值,然后进行两次赋值 . 我建议对初始化列表进行一些研究 .以下链接将帮助您:
Difference between private, public, and protected inheritance
http://www.geeksforgeeks.org/inheritance-in-c/