c – 封装概念在这里被侵犯了吗?
作者:互联网
#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