如果'C'从'B'公开继承,B私下从'A'继承,为啥我不能在'C'内部创建'A'的对象? [复制]

Posted

技术标签:

【中文标题】如果\'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'? [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'?

【问题讨论】:

【参考方案1】:

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

就是所谓的注入类名。

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

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

使用以下使用限定名的方法

class A ;
class B : private A ;
class C : public B

    void func()
    
        ::A a;
      //^^^^^^ 
    
;

【讨论】:

以上是关于如果'C'从'B'公开继承,B私下从'A'继承,为啥我不能在'C'内部创建'A'的对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何继承从一个基类继承的不同类的特定变量?

为啥 Adapter 会从 Target 公开继承,而从 Adapter 私下继承?

为啥即使对于私有链接也会继承包含路径

java子类从父类继承某个属性,怎么添加特定的注解不影响父类

继承简介

仅用于代码重用c ++的继承