【问题标题】:What is the value of private members here?这里私人会员的价值是什么?
【发布时间】:2011-06-15 08:03:22
【问题描述】:

如果我有两个类AB,那么B inehrits A。也就是说,A 是基类,B 是派生类。

现在,假设类 Aprivate 成员。由于类B继承类A,私有数据成员成为类B的一部分。

我们知道,私有成员被称为即使派生类也不能访问,但是,它们现在在派生类中。在这种情况下,隐私的价值是什么?

谢谢。

【问题讨论】:

  • 是的,英文比代码更好(也更简洁)地描述了这个问题。
  • 您可以访问基类的私有成员。编译器只保护你不这样做而不是阻止。乙乙; ((A*)&B)->any_private_member = 0;
  • @9dan:其实那也行不通。

标签: c++ oop inheritance private


【解决方案1】:

B 的成员函数不能以任何方式使用它们,但它们将对 A 的成员函数有用,而 B 又将依赖它们。这只是另一个级别的封装(B 不应该关心A 的功能是如何实现的)。

【讨论】:

    【解决方案2】:

    好吧,因为它们是 A 类私有的,所以我假设 A 类的实例将它们用于某些用途。如果没有,它们可以被删除。

    【讨论】:

      【解决方案3】:

      它将保留 - 一个私人成员。

      不知道你在哪里看到不能访问的?

      【讨论】:

      • 没错,派生类不能(没有像将其转换为 A 对象这样的技巧)访问其父类的私有成员
      【解决方案4】:

      “private”的目的是告诉编写 B 类的开发人员他们不应该访问该成员。

      A 类的开发者以某种 B 类的开发者不需要关心的方式使用该成员。

      【讨论】:

        【解决方案5】:

        B 对象的 A 成员将是您的对象所需要的任何成员,以表示您用它表示的内容。一个类的方法可能会使用它们,并且您可能会调用一些 A 类方法。实际上,您应该只关心 A 的公共(或受保护)接口并利用它。

        例如:如果 A 是具有写入和读取方法的 TCP/IP 协议套接字实现,则 B 可能是 A 之上的 SSL 实现。您(基本上)将重新定义读取和写入,以便进行加密,并且然后使用 A::read 和 A::write 对套接字进行实际的写入和读取。在此设计中,您无需知道您的套接字(或 TCP 协议细节)是什么,因此 A 为您抽象了它,而您无权访问它。

        【讨论】:

          【解决方案6】:

          因为,不管你信不信,你不想将 B 与 A 的实现细节结合起来。想象一个使用最简单的场景:

          struct A
          {
          protected:
            int x;
          };
          
          struct B
          {
            void f() { ... access x and use as input ... }
          };
          

          现在,假设需要对您的产品进行更改,现在 A 没有 x 变量,而是获取值 x 以其他方式表示,可能是组合。由于 B 直接访问成员,因此您必须更改您创建的任何 B 以通过任何没有到位的新机制来获取 x。改变的越多,问题的余地就越大。

          如果您改为将 x 设为私有成员并提供受保护的 getter,则不会遇到此问题。

          同样,这是最简单的例子。一般来说,像 x 这样的值用于实现 A 的行为,而 B 不应该关心行为是如何实现的,也不应该对其进行处理。

          【讨论】:

            猜你喜欢
            • 2011-07-06
            • 2012-02-27
            • 2022-01-18
            • 1970-01-01
            • 1970-01-01
            • 2019-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多