C ++中的私有基类可访问性

时间:2013-05-30 01:02:23

标签: c++

我最近不得不做这样的事情:

class A { };
class B : private A { };
class C : public B {
    public:
        A *myA;
};

int main() {
    return 0;
}

我在尝试的三个编译器中出错了。当我将myA的声明更改为::A *myA时,一切正常。我在C ++标准中探讨过,发现了第11.2节第3段,其中说:

  

注意:私有基类的成员可能无法作为继承的成员名称访问,但可以直接访问。

哪个是相关的,但不清楚。为什么名称A无法访问?如果A未被隐藏会出现什么问题?

谢谢,
-Ben

1 个答案:

答案 0 :(得分:3)

它可能会出现错误":

namespace nmsp
{
    class A {};
}

class A {};

class B : private nmsp::A
{
    // well-formed:
    A* d; // refers to the injected-class-name nmsp::A!!
};

class C : public B
{
    // ill-formed
    A* p; // refers to the injected-class-name nmsp::A!!
};

它不应该依赖于base-clause中的access-specifier,而是使用::Anmsp::A,否则它将是容易出错的IMO。