在派生的C 类中,访问基类受保护成员作为公共的访问声明
Access declaration of a protected member of base class as public in derived class C++
当我在基类中声明一个受保护的成员并在派生类中继承为私有
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
的时刻说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
默认为不确定的值,然后进行了两个分配。我建议一些有关初始化列表的研究。
相关文章:
- C++:无法访问声明的受保护成员
- 访问在 C++ 结构中声明的枚举变量
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 在 C++ 中声明和访问 C 库中的结构
- 在使用受保护和继承时无法访问在类中声明的私有成员
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 如何访问转发声明类的成员
- 在 if 语句中声明时如何访问类对象?(在 C++ 中)
- 在类访问混淆中声明的枚举类型
- 在 c++ 中直接访问的内联数组声明
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 如何访问在 c++ 中在类内声明的结构类型指针变量?
- 使用好友声明访问私有模板
- C++中成员名称查找和访问声明中的歧义
- 在派生的C 类中,访问基类受保护成员作为公共的访问声明
- 如何在 SWIG 中访问声明的模板结构变量
- xcode 5.1.1抱怨:ISO c++ 11不允许访问声明
- 不赞成使用访问声明,而是使用-declarations;建议:添加“using”关键字
- 公共访问声明不会影响成员函数指针