【问题标题】:How to make C++ inheritance preserve access specifer [duplicate]如何使C ++继承保留访问说明符[重复]
【发布时间】:2012-12-14 11:34:37
【问题描述】:

可能重复:
What are access specifiers? Should I inherit with private, protected or public?

如何在 C++ 中创建一个派生类,它保留属性和方法的访问说明符,如下所示:

class Base
{
private:
    void base_private();

protected:
    void base_protected();

public:
    void base_public();
};

class A: [what type is appropriate here?] Base
{
public:
    void test() {
        base_protected(); // Ok
    }
};

class B: [what type is appropriate here?] A
{
public:
    void test() {
        base_protected(); // Ok
    }
};

int main()
{
    A a;
    B b;

    a.base_public();        // Ok
    a.base_protected();     // Not Ok
    b.base_protected();     // Not Ok
    b.test();               // Ok

    return 0;
}

我的意思是base_protected() 方法在派生类中仍然受到保护,但base_public() 是公共的。

【问题讨论】:

  • 这就是标准的public继承所做的。
  • @BoPersson:所以不是public继承使基类protected中的所有方法都变为public
  • @BìnhNguyên:您需要阅读并理解标记的副本。它应该回答你所有的问题。
  • @Binh - 不,它设置了可见性限制。如果您使用受保护的继承,则继承的名称将是受保护的或私有的。使用私有继承,一切都是私有的。使用公共继承,一切都保持在基类中的方式。
  • @BoPersson:非常感谢

标签: c++


【解决方案1】:

让我们考虑Base 成员的可用性:

  • base_private 对客户不可用,但对 Base 本身可用
  • base_protected 对客户不可用,但对 Base 本身可用
  • base_public 可供客户使用,Base

现在,如果你有class A : public Base(公共继承),Base 的成员的可用性将是:

  • base_private 对客户不可用,A 本身不可用
  • base_protected 对客户不可用,但对 A 本身可用
  • base_public 可供客户使用,A

现在,您要问的是如何为BaseA 这两个类保持相同的客户端界面。如果您查看上面列表中客户的成员可用性,您会发现BaseA 完全相同:base_private 不可用; base_protected 不可用; base_public 可用。

BaseA 之间的唯一变化是 A 无法访问 Base 的私有成员。这就是protected 访问控制的重点——它使派生类可以访问它们的基类成员,而不会让它们对客户端可用。

所以public继承是你需要的。

【讨论】:

    【解决方案2】:

    派生类可以访问基类的publicprotected 成员,无论您继承privateprotected 还是public

    当您继承private 时,基类的所有成员都被视为private 对于A 的派生类。与protected 继承类似,A 的派生类可以访问Baseprotectedpublic 成员。

    privateprotected 继承这两种情况下,“公众”都无法访问Base 的成员。

    现在回答您的问题,使用public 继承来保留基类的访问说明符。

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 2018-06-22
      • 2014-09-09
      • 2012-04-09
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2017-09-17
      相关资源
      最近更新 更多