C++ 实际使用';受保护';C+中的说明符+;

C++ 实际使用';受保护';C+中的说明符+;,c++,protected,C++,Protected,我知道这个说明符是如何工作的 我对这些东西在实际编程中的实际应用感兴趣。我无法想象在任何情况下,受保护的类成员确实是必要的(我的意思是当我们不能用“private”替换“protected”时)。一个类有两个API——一个用于实例化它并使用结果对象的代码,另一个用于子类 第一个API是public成员,第二个API是public和protected成员。子类可以访问的操作和数据,而“普通用户”不能访问 作为一个具体的例子,设想一个Windows GUI类库。它包装并隐藏普通的旧Windows A

我知道这个说明符是如何工作的


我对这些东西在实际编程中的实际应用感兴趣。我无法想象在任何情况下,受保护的类成员确实是必要的(我的意思是当我们不能用“private”替换“protected”时)。

一个类有两个API——一个用于实例化它并使用结果对象的代码,另一个用于子类

第一个API是
public
成员,第二个API是
public
protected
成员。子类可以访问的操作和数据,而“普通用户”不能访问

作为一个具体的例子,设想一个Windows GUI类库。它包装并隐藏普通的旧Windows API。一个
窗口
表示一个窗口,它有一个
HWND
,它是底层的窗口句柄。它对
窗口
类的用户隐藏
HWND
,因为这与他们无关(或者如果他们可以使用它,它只通过只读访问器公开)。但是
Window
的子类,如
FrameWindow
EditControl
,可以直接访问
HWND

class Window
{
public:
    void Show();  // Example public API

protected:
    HWND m_hwnd;
};

当你的问题真的有必要问的时候,你可能会伤害到你的问题。整个C++语言并不真正需要。你是在问它什么时候有用吗?我想我应该退后一步。当/如果您使用继承,那么protected的用法似乎相当明显(至少对我来说)。IMO,真正的问题是:“C++中继承的实际用途是什么?”@ JerryCoffin,如果它真的很明显,我何时何地不能用“私有”或“公共”来替换“受保护的”?(视情况而定)@mechanical:最明显的例子是,一个私有和虚拟的函数几乎不可能被证明是正确的。我不知道为什么这个问题会被解决。对于那些学习面向对象编程的人来说,这是一个非常好的问题。从评论来看,这个问题似乎已经经历了一些调整,以安抚我们一些更迂腐的S.O.成员。我认为这个问题的意图是明确的,对新手程序员来说是有价值的。我喜欢“两个API”这个术语。所有这些在设计可重用框架时尤其如此。@SimonWhitehead:实际上有三个API:)客户端的公共API、为派生类型提供服务的受保护API和从派生类型获取服务的虚拟API。你可以在谷歌上搜索NVI(非虚拟接口),它讨论了如何为公共和虚拟接口进行设计。不过,我看到了一种偏好,即只将非公共方法(虚拟或其他)设置为受保护,但总是强制数据成员为私有。一般来说,我发现这在设计类层次结构时是有用的;但有时保护数据更有意义——例如,如果数据是函子。