在派生类C ++中将受保护的基类成员的声明声明为public

时间:2017-11-23 20:43:37

标签: c++ class inheritance protected

当我声明一个受基类保护的成员并在派生类中继承为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 ++中阅读完整的参考书,授予访问权限将恢复访问权限,但不能提升或降低访问状态。

任何人都可以告诉我为什么我能够访问基类的受保护成员,私有地继承,然后像派生类的公共变量一样给予公共访问(不会违反封装,即受保护的成员应该恢复为保护)。 如果我的理解不正确,请指导我

2 个答案:

答案 0 :(得分:1)

protected并不辜负它的名字。它只是没有多少保护;它离public不远。

baseaprotected时,这个领域的命运是封闭的 - 它现在几乎对世界其他地方开放了。您所要做的就是创建一个派生类,访问成员变量并向外界公开 - 这是您在编写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;}

这里发生的是构造basea默认初始化为不确定值,然后b默认初始化为不确定值,然后进行两次分配。我建议对初始化列表进行一些研究

答案 1 :(得分:0)