1

可能重复:
什么是访问说明符?我应该以私有、受保护还是公共继承?

如何在 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()是公共的。

4

2 回答 2

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

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

Base和之间唯一不同的AA不能访问私有的成员Base。这就是protected访问控制的全部意义——它使派生类可以访问它们的基类成员,而不使它们对客户可用。

所以public继承是你需要的。

于 2012-12-29T14:25:02.857 回答
0

派生类可以访问基类的public和成员,protected无论您是继承还是。privateprotectedpublic

当您继承private基类的所有成员时,都会考虑privateA. 类似的protected继承,派生类A可以访问protectedpublic成员Base

在这两种情况下,private以及protected继承中,Base“公众”都无法访问 的成员。

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

于 2012-12-29T14:23:54.793 回答