gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:38:05 24 4
gpt4 key购买 nike

#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++ 封装的一个重要且经常被忽视的方面。

我的回答是“是的,封装被破坏了,但不是你想的那样”。实际的违规行为是在一开始就将方法声明为 protected

您的代码很好地展示了与子类的 protected 关系的问题……它们可以轻松地解除对您的保护。另一种说法是,如果您要让成员protected,您不妨将其设为public,因为实际上protected public 如果您的子类希望它是。

这在实践中意味着什么?

这意味着如果您将成员函数设置为protected,它将永远是您类接口(interface)的一部分。因此,您必须像对待任何其他公共(public)成员函数一样认真对待它,并且确实就好像它是一个公共(public)成员函数一样。

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

关于c++ - 这里是否违反了封装的概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32850354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com