这里是否违反了封装的概念?
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成员他们继承,并且还允许访问他们继承的受保护成员。
在您的例子中,B
,A
的子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
,因为实际上 protected
是 public
,如果您的子class我希望它成为。
这在实践中意味着什么?
这意味着如果你创建一个成员函数protected
,它永远是你class接口的一部分。因此,您必须像对待任何其他 public 成员函数一样认真对待它,实际上 就好像它是 一个 public 成员函数一样。
也就是说它应该尽可能无状态,前提条件尽可能少,如果您更改实现,对整个对象的逻辑影响必须保持不变。
#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成员他们继承,并且还允许访问他们继承的受保护成员。
在您的例子中,B
,A
的子class,决定添加一个名为 func
的新成员函数,其实现恰好包含一个单次调用 A::func
.
一般来说,protected
成员及其 public
成员应被视为 class 的 接口 的一部分。尽管它们的可见性仅限于子 classes,但受保护成员不是 class 实现 的一部分,因为对受保护成员命名或语义的任何更改需要与 class.
这是一个有趣的问题,我认为它突出了 c++ 中封装的一个重要且经常被忽视的方面。
我的回答是"yes, encapsulation has been violated, but not where you think"。实际的违规行为是首先将方法声明为 protected
。
您的代码很好地演示了与子classes 的受保护关系的问题...它们可以轻松解除对您的保护。另一种说法是,如果您要创建一个成员 protected
,您最好将其创建为 public
,因为实际上 protected
是 public
,如果您的子class我希望它成为。
这在实践中意味着什么?
这意味着如果你创建一个成员函数protected
,它永远是你class接口的一部分。因此,您必须像对待任何其他 public 成员函数一样认真对待它,实际上 就好像它是 一个 public 成员函数一样。
也就是说它应该尽可能无状态,前提条件尽可能少,如果您更改实现,对整个对象的逻辑影响必须保持不变。