这里是否违反了封装的概念?

Is Concept of Encapsulation Violated here?

#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;
}

为什么上面的代码运行成功?

这不违反封装的概念吗?

如有错误请指正

您展示的示例不是违反封装的,因为子class允许在什么之上添加public成员他们继承,并且还允许访问他们继承的受保护成员。

在您的例子中,BA 的子class,决定添加一个名为 func 的新成员函数,其实现恰好包含一个单次调用 A::func.

一般来说,protected 成员及其 public 成员应被视为 class 的 接口 的一部分。尽管它们的可见性仅限于子 classes,但受保护成员不是 class 实现 的一部分,因为对受保护成员命名或语义的任何更改需要与 class.

的所有子 class 的更改相协调

这是一个有趣的问题,我认为它突出了 c++ 中封装的一个重要且经常被忽视的方面。

我的回答是"yes, encapsulation has been violated, but not where you think"。实际的违规行为是首先将方法声明为 protected

您的代码很好地演示了与子classes 的受保护关系的问题...它们可以轻松解除对您的保护。另一种说法是,如果您要创建一个成员 protected,您最好将其创建为 public,因为实际上 protectedpublic,如果您的子class我希望它成为。

这在实践中意味着什么?

这意味着如果你创建一个成员函数protected,它永远是你class接口的一部分。因此,您必须像对待任何其他 public 成员函数一样认真对待它,实际上 就好像它是 一个 public 成员函数一样。

也就是说它应该尽可能无状态,前提条件尽可能少,如果您更改实现,对整个对象的逻辑影响必须保持不变。