这两个类是否违反了封装?

Yog*_*ora 9 c++ inheritance encapsulation

class X
{
protected:
    void protectedFunction() { cout << "I am protected" ; }
};

class Y : public X
{
public:
    using X::protectedFunction;
};

int main()
{
    Y y1;
    y1.protectedFunction();
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以公开基类的一个功能.

  1. 这不违反封装原则吗?
  2. 是否有一个特定的原因,为什么这是标准的?
  3. 是否有任何用途,或者是否会在新标准中进行更改?
  4. 标准中是否存在与此相关的未解决问题?

Myk*_*yev 18

你是自己做的.
你可以写

class Y : public X
{
public:
    void doA()
    {
       protectedFunction();
    }
};

int main()
{
    Y y1;
    y1.doA(); 
}
Run Code Online (Sandbox Code Playgroud)

我认为没有理由担心它.
受保护的函数是继承树中可重用逻辑的一部分.你可以隐藏它们,如果有一些内部逻辑或限制,或者像你的情况那样你可以暴露它,如果你确定这不会伤害任何人.


Otá*_*cio 12

是的,这就是为什么受保护已经受到了公平的批评.

C++的创建者Bjarne Stroustrup在他的优秀着作"C++的设计和演变"中对此感到遗憾:

我对受保护的一个担忧正是因为它太容易使用一个共同的基础,就像人们可能已经习惯使用全局数据一样....回想起来,我认为受保护是一个"好的论据"和时尚克服的情况我更好的判断力和接受新功能的经验法则.

  • 他还说他认为受保护的功能是个好主意.这里的问题是使用"使用"(我建议不好),而不是使用"受保护". (5认同)
  • @Martin,这本书说保护功能:好的,受保护的数据:坏.你真的读过吗? (2认同)

And*_*yes 11

我认为正是Stroustrup本人说C++中内置的封装和数据完整性功能旨在让诚实的人保持诚实,而不是阻止犯罪分子.

  • 我喜欢这些问题的C++ FAQ中的一些答案."我怎么能禁止别人......" - 写一条评论说,'以及我如何阻止他们这样做......' - 写一条评论说如果他们这样做就会被解雇."但是,如果我真的,真的想要阻止......" - 解雇这个家伙. (4认同)