Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在派生类C+中将基类的受保护成员的访问声明为public+;_C++_Class_Inheritance_Protected - Fatal编程技术网

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

C++ 在派生类C+中将基类的受保护成员的访问声明为public+;,c++,class,inheritance,protected,C++,Class,Inheritance,Protected,当我在基类中声明一个受保护的成员并在派生类中作为私有继承时,不允许访问该成员 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;

当我在基类中声明一个受保护的成员并在派生类中作为私有继承时,不允许访问该成员

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();
}
现在我可以在main()中更改“a”的值,而不会出现任何错误

我在C++完整的参考书中阅读,授予访问权将恢复访问权限,但是不能提高或降低访问状态。 有人能告诉我为什么我能够访问基类的受保护成员、私有继承的成员、以及后来像派生类的公共变量一样被赋予公共访问权的成员(这是否违反了封装,即受保护的成员应该恢复为受保护的成员)。


如果我的理解不正确,请指导我以下链接将帮助您:


受保护的
不符合其名称。它只是保护不了多少;它离公众不远

base
a
受到
保护的那一刻,这个领域的命运就注定了——它现在实际上向世界其他地方开放。您所要做的就是创建一个派生类,访问成员变量并向外界公开—这就是您在编写
base::a
时使用
derived
所做的(顺便说一句,您通常在这之前使用
添加

毕竟,您甚至可以使用普通函数来实现这一点:

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
默认初始化为不确定值,然后进行两次赋值。我建议对初始化列表进行一些研究。

受保护的变量只能在派生类内部访问。受保护变量不是公共变量,可用作
d.a=20.protected将成员提供给其派生类,但它不提供给公众(外部使用),当您公开受保护的成员时,其他人也可以公开使用它。感谢您的反馈,使用private它工作正常(我尝试更改访问权限时出错)。初始化列表注意:)
derived():base(){ a=0; b=0;}