标签:c oop encapsulation
#include<iostream>
class A {
public:
int a;
protected:
void func() {
std::cout<<"protected member"<<endl;
}
};
class B:public A
{
public:
using A::func; //Isn't this violation of encapsulation?
};
int main(){
B b;
b.func();
return 0;
}
为什么上面的代码成功运行?
它是否违反了封装的概念?
如果我错了,请纠正我.
解决方法:
这是一个有趣的问题,我认为它突出了c中封装的一个重要且经常被忽视的方面.
我的回答是“是的,封装已被违反,但不是你认为的地方”.实际的违规行为是首先声明要保护的方法.
您的代码很好地证明了与子类的受保护关系的问题……它们可以轻松地为您保护.另一种说法是,如果你要使一个成员受到保护,你也可以公开它,因为实际上受保护是公共的,如果你的子类想要它.
这在实践中意味着什么?
这意味着如果您使成员函数受到保护,它将永远是您类的接口的一部分.因此,您必须像对待任何其他公共成员职能一样认真对待,事实上它就像是公共成员职能一样.
也就是说,它应尽可能无状态,尽可能少的前提条件,如果你改变实现,整个对象的逻辑效果必须保持不变.
标签:c,oop,encapsulation
来源: https://codeday.me/bug/20190829/1762978.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。