由于私有继承而无法访问的类型
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
。事实上,如果A
是B
的私有祖先,除了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++ 继承模型的混乱。私有继承不是继承它的组成,使用相同的语义来完成两个独立的概念只会令人困惑。
这是组合继承和私有继承的区别,因为后者允许你访问你父亲的受保护成员,而前者不允许。
我仍然不建议使用它,除非在这种情况下。以上是关于由于私有继承而无法访问的类型的主要内容,如果未能解决你的问题,请参考以下文章