【问题标题】:Practical use of 'protected' specifier in C++ [closed]在 C++ 中实际使用“受保护”说明符 [关闭]
【发布时间】:2013-03-24 09:48:39
【问题描述】:

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

我对这些东西在实际编程中的实际使用很感兴趣。我无法想象任何真正需要受保护的类成员的例子(我的意思是当我们不能用“私有”替换“受保护”时)。

【问题讨论】:

  • 您可能会在真正需要时询问您的问题。整个 C++ 语言并不是真正必要的。你问什么时候有用?
  • 我想我会退后一步。当/如果您使用继承时,受保护的使用似乎相当明显(至少对我而言)。 IMO,真正的问题是:“C++ 中继承的实际用途是什么?”
  • @JerryCoffin 如果真的很明显,我不能在何时何地用“私人”或“公共”替换“受保护”? (视情况而定)
  • @mechanic:举个最明显的例子,一个既是私有又是虚拟的函数几乎是不可能的。
  • 不知道为什么这个问题被关闭了。对于那些学习面向对象编程的人来说,这是一个非常好的问题。在 cmets 看来,这个问题似乎经过了一些重新格式化,以安抚我们一些更迂腐的 S.O.成员。我认为这个问题的意图很明确,对新手程序员很有价值。

标签: c++ protected


【解决方案1】:

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

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

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

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

protected:
    HWND m_hwnd;
};

【讨论】:

  • 我喜欢“两个 API”这个词。所有这些在设计可重用框架时尤其如此。
  • @SimonWhitehead:实际上有 三个 API :) 面向客户端的公共 API,您为派生类型提供服务的受保护的 API,以及您的基础从中获取服务的虚拟 API派生类型。您可以在 Google 上搜索 NVI(非虚拟接口),其中讨论了如何为公共和虚拟接口进行设计 +1
  • 最近,我看到了一种偏好,即只将非公共方法、虚拟方法和其他方法设置为受保护,但始终强制数据成员为私有。一般来说,在设计类层次结构时,我发现它很有用;但有时保护数据更有意义 - 例如,如果数据是函子。
猜你喜欢
  • 2014-12-26
  • 2021-08-29
  • 1970-01-01
  • 2011-12-22
  • 2017-03-26
  • 2012-04-09
  • 2011-12-28
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多