5

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

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不隐藏会出现什么问题?

谢谢,
-本

4

1 回答 1

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!!
};

它不应该依赖于基句中的访问说明符是否::Anmsp::A使用,否则它会容易出错 IMO。

于 2013-05-30T01:30:03.220 回答