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

If 'C' inherits from 'B' publicly, B inherits from 'A' privately, Why can't I create an object of 'A' inside 'C'?

本文关键字:继承 创建 对象 如果 为什么 不能      更新时间:2023-10-16

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

class A {};
class B : private A {};
class C : public B
{
void func()
{
A a{};
}
};

我收到此错误:

错误 C2247:"A"不可访问,因为"B"使用"私有"进行继承 从"A">

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

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

它是一个所谓的注入类名。

从C++标准(6.3.2声明点(

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

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

class A {};
class B : private A {};
class C : public B
{
void func()
{
::A a{};
//^^^^^^ 
}
};