由于私有继承而无法访问的类型

Posted

技术标签:

【中文标题】由于私有继承而无法访问的类型【英文标题】:Inaccessible type due to private inheritance 【发布时间】:2011-12-22 02:29:27 【问题描述】:

g++ 拒绝我访问一个类型,只是因为它恰好是一个私人祖父。这有意义吗?

struct A ;

struct B : private A ;

struct C : B 
  void foo(A const& a) 
;

编译得到:

1:10: error: ‘struct A A::A’ is inaccessible
6:12: error: within this context

我的意思是:我从不想以祖先身份访问A。事实上,如果AB 的私有祖先,除了B(即C)之外的任何人不应该完全不可见吗?

当然,我可以使用 protected 继承,但在我的情况下,它没有任何意义。

【问题讨论】:

【参考方案1】:

这是由于来自A 的注入类名将全局A 隐藏在C 中。尽管A 可见,但它不可访问(因为它是作为私有导入的),因此出现错误。您可以通过在全局命名空间中查找来访问A

void foo(::A const& a) 

【讨论】:

【参考方案2】:

如果你如下声明它就可以工作

struct A ;

struct B : private A ;

struct C : B 
  void foo(::A const& a) 
;

您看到的错误是名称解析无法访问。 ::A 说查看全局命名空间而不是我继承的嵌套类类型。还要记住,私有继承只是说 B 有一个 A,而 IMOHO 是一个应该避免的愚蠢的语言特性。

【讨论】:

这根本不是一个愚蠢的功能;它允许通过单独选择要使用using 公开的函数来限制继承的接口。 您可以在没有该功能的情况下使用转发器函数并减少 c++ 继承模型的混乱。私有继承不是继承它的组成,使用相同的语义来完成两个独立的概念只会令人困惑。 这是组合继承和私有继承的区别,因为后者允许你访问你父亲的受保护成员,而前者不允许。 我仍然不建议使用它,除非在这种情况下。

以上是关于由于私有继承而无法访问的类型的主要内容,如果未能解决你的问题,请参考以下文章

PHP继承的父方法无法访问孩子的私有属性

使用受保护和继承时无法访问在类中声明的私有成员

5继承与派生2-访问控制

未序列化的结构列表列表。 System.RuntimeType 由于其保护级别而无法访问。只能处理公共类型

如何访问私有的指向的类

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法