【问题标题】:If 'C' inherits from 'B' publicly, B inherits from 'A' privately, Why can't I create an object of 'A' inside 'C'? [duplicate]如果'C'从'B'公开继承,B私下从'A'继承,为什么我不能在'C'内部创建'A'的对象? [复制]
【发布时间】:2020-05-30 22:08:35
【问题描述】:
我正在使用 Visual C++,如果我编译这段代码:
class A {};
class B : private A {};
class C : public B
{
void func()
{
A a{};
}
};
我收到此错误:
错误 C2247:“A”不可访问,因为“B”使用“私有”继承
来自'A'
我知道如果我使用私有继承,那么类'A'的成员在'B'中是私有的,而在'C'中是不可访问的,但是为什么我不能在里面创建'A'的对象'C'?
【问题讨论】:
标签:
c++
inheritance
scope
access-modifiers
name-lookup
【解决方案1】:
问题在于类 C 范围内的名称 A 是私有名称。
就是所谓的注入类名。
来自 C++ 标准(6.3.2 声明点)
8 注入类名(第 12 条)的声明点是
紧跟在类定义的左大括号之后。
使用以下使用限定名的方法
class A {};
class B : private A {};
class C : public B
{
void func()
{
::A a{};
//^^^^^^
}
};