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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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"(在基中受保护)授予公共访问权限

1
2
3
4
5
6
7
8
9
10
11
12
13
class derived : public base
{
protected:
int b;
public:
base::a;
};

int main ()
{
derived d;
d.a=20;   // no error
}

现在,我可以在main()中更改"a"的值,而不会出现任何错误。

我在C++中阅读完整的参考书,授予访问权限将恢复访问权限,但不能提高或降低访问状态。

有人能告诉我为什么我能访问基类的受保护成员,私下继承,然后像派生类的公共变量那样被授予公共访问权限(它不违反封装吗,即受保护的成员应该还原为受保护的成员)。如果我的理解不正确,请指导我


protected名不副实。它只是保护不了太多,离public不远。

baseaprotected的时候,这个领域的命运就被封了——它现在实际上已经向世界其他地方开放了。您所要做的就是创建一个派生类,访问成员变量并将其公开给外部世界——这就是您在编写base::a时对derived所做的(顺便说一下,通常在这之前添加using)。

你甚至可以用一个正常的函数来做,毕竟:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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++是如何工作的:

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

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


以下链接将帮助您:

私有继承、公共继承和受保护继承之间的差异

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