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

Private base class accessibility in C++

本文关键字:访问 基类 c++      更新时间:2023-10-16

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

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

谢谢,

可能出错的地方:

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

使用::A还是nmsp::A不应该依赖于base子句中的访问说明符,否则容易出错IMO