当我声明一个受基类保护的成员并在派生类中继承为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'(基础保护)
授予公共访问权限class derived : public base
{
protected:
int b;
public:
base::a;
};
int main ()
{
derived d;
d.a=20; // no error
}
现在我可以在main()中更改'a'的值而不会出现任何错误。
我在c ++中阅读完整的参考书,授予访问权限将恢复访问权限,但不能提升或降低访问状态。
任何人都可以告诉我为什么我能够访问基类的受保护成员,私有地继承,然后像派生类的公共变量一样给予公共访问(不会违反封装,即受保护的成员应该恢复为保护)。 如果我的理解不正确,请指导我
答案 0 :(得分:1)
protected
并不辜负它的名字。它只是没有多少保护;它离public
不远。
当base
说a
是protected
时,这个领域的命运是封闭的 - 它现在几乎对世界其他地方开放了。您所要做的就是创建一个派生类,访问成员变量并向外界公开 - 这是您在编写derived
时使用base::a
所做的事情(顺便提一下,您通常会添加在此之前using
。
毕竟,您甚至可以使用正常功能执行此操作:
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
}
如果您需要保护,请使用private
。
顺便说一句,以下行可能会给你一个关于C ++如何工作的错误印象:
derived():base(){ a=0; b=0;}
这里发生的是构造base
,a
默认初始化为不确定值,然后b
默认初始化为不确定值,然后进行两次分配。我建议对初始化列表进行一些研究。
答案 1 :(得分:0)