首页 文章

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

提问于
浏览
2

当我声明一个受基类保护的成员并在派生类中继承为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 回答

  • 1

    protected 没有多少保护;距离 public 不远 .

    现在 baseaprotected ,现在's fate is sealed - it'现在几乎对世界其他地方开放了 . 您所要做的就是创建一个派生类,访问成员变量并向外界公开 - 这是您在编写 base::a 时所做的 derived (顺便说一句,您通常在此之前添加 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 
    }
    

    If you want protection, use private.

    顺便说一句,以下行可能会给你一个关于C如何工作的错误印象:

    derived():base(){ a=0; b=0;}
    

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

相关问题