其他分享
首页 > 其他分享> > c – 封装概念在这里被侵犯了吗?

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