如何使C ++继承保留访问说明符

时间:2012-12-29 14:13:05

标签: c++

  

可能重复:
  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()是公开的。

2 个答案:

答案 0 :(得分:2)

让我们考虑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继承是你需要的。

答案 1 :(得分:0)

无论您是继承publicprotected还是private,派生类都可以访问基类的protectedpublic成员。

当您继承private时,基类的所有成员都被视为private的派生类A。类似于protected继承,A的派生类可以访问protected的{​​{1}}和public成员。

在这两种情况下,Baseprivate继承,“公共”无法访问protected的成员。

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