在派生的C 类中,访问基类受保护成员作为公共的访问声明

Access declaration of a protected member of base class as public in derived class C++

本文关键字:访问 声明 成员 基类 派生 类中 受保护      更新时间:2023-10-16

当我在基类中声明一个受保护的成员并在派生类中继承为私有

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 完整参考书中阅读,授予访问将恢复访问权限,但无法提高或降低访问状态。

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

,请指导我

以下链接将帮助您:

私人,公共和受保护的继承之间的差异

http://www.geeksforgeeks.org/inheritance-in-c/

protected不符合其名称。它并不能太多保护;它离public不远。

base的时刻说aprotected,该领域的命运已被密封 - 现在几乎向世界其他地方开放。您所要做的就是创建一个派生类,访问成员变量并展示的就是向外界 - 这是您在编写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 
}

如果需要保护,请使用private

顺便说一句,以下行可能会给您错误地印象C 的工作方式:

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

这里发生的是base是构建的,a被默认为不确定的值,然后b默认为不确定的值,然后进行了两个分配。我建议一些有关初始化列表的研究