如果'C'公开继承'B',B私下继承'A',为什么我不能在'C'内部创建一个'A'的对象?

Sta*_*123 7 c++ inheritance scope access-modifiers name-lookup

我正在使用 Visual C++,如果我编译这段代码:

class A {};
class B : private A {};
class C : public B
{
    void func()
    {
        A a{};
    }
};
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

错误 C2247:“A”不可访问,因为“B”使用“私有”从“A”继承

我知道如果我使用私有继承,那么类 'A' 的成员在 'B' 中将是私有的,在 'C' 中不可访问,但是为什么我不能在 'C' 中创建一个 'A' 的对象?

Vla*_*cow 7

问题是A类 C 范围内的名称是私有名称。

它是所谓的注入类名。

来自 C++ 标准(6.3.2 声明点)

8 注入类名的声明点(第 12 条)紧跟在类定义的左大括号之后。

使用以下方法,即使用限定名称

class A {};
class B : private A {};
class C : public B
{
    void func()
    {
        ::A a{};
      //^^^^^^ 
    }
};
Run Code Online (Sandbox Code Playgroud)