派生类 C++ 中基类受保护成员的访问声明为公共的
Posted
技术标签:
【中文标题】派生类 C++ 中基类受保护成员的访问声明为公共的【英文标题】:Access declaration of a protected member of base class as public in derived class C++ 【发布时间】:2018-05-07 20:44:06 【问题描述】:当我在基类中声明一个受保护的成员并在派生类中继承为私有时,不允许访问该成员
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++完整参考书,授予访问权限将恢复访问权限,但不能提高或降低访问状态。
谁能告诉我为什么我能够访问基类的受保护成员,私有继承,然后像派生类的公共变量一样提供公共访问(它不违反封装,即受保护的成员应该恢复为受保护)。 如果我的理解不正确,请指导我
【问题讨论】:
受保护的变量只能在派生类内部访问。受保护变量不是公共变量,可以用作d.a=20;
。
protected 将成员提供给其派生类,但不提供给公众(外部使用),当您公开受保护的成员时,其他人也可以公开使用它。
【参考方案1】:
protected
名副其实。它只是不能保护太多;离public
不是很远。
当base
说a
是protected
的那一刻,这个领域的命运就注定了——它现在实际上对世界其他地方开放。您所要做的就是创建一个派生类,访问成员变量并向外部世界公开 - 这是您在编写 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
被默认初始化为一个不确定的值,然后进行了两次分配。我建议对初始化列表进行一些研究。
【讨论】:
感谢您的反馈,使用私有它可以正常工作(当我尝试更改访问权限时出现错误)。注意初始化列表 :)【参考方案2】:以下链接将为您提供帮助:
Difference between private, public, and protected inheritance
http://www.geeksforgeeks.org/inheritance-in-c/
【讨论】:
以上是关于派生类 C++ 中基类受保护成员的访问声明为公共的的主要内容,如果未能解决你的问题,请参考以下文章