【问题标题】:Private base class accessibility in C++C++ 中的私有基类可访问性
【发布时间】:2013-05-25 10:44:25
【问题描述】:

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

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

谢谢,
-本

【问题讨论】:

  • 我希望它能够编译,因为类 C 只是定义了一个变量 myA,它是指向 A 类类型变量的指针。myA 是在 B 类还是 A 类中定义为那些课程之一?
  • 不。如果您将该代码复制并粘贴到您的编辑器中,您应该会得到相同的错误。至少对于 clang、gcc 和 Visual Studio 2010。
  • 名称A被注入到类A中并继承到B中。 [class]/2 告诉我们“出于访问检查的目的,注入的类名被视为公共成员名。”这就是为什么注入的类名A 不能从C 访问。

标签: c++


【解决方案1】:

它可能“出错”的地方:

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 会出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2012-01-05
    • 2016-07-15
    • 2010-11-23
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多