2011-11-04 48 views
14

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继承,但在我的情况下,它没有任何意义。

回答

13

这是由于从A注入的类名称隐藏在C内部的全球A。虽然A是可见的,但它不可访问(因为它是作为私人导入的),因此是错误。您可以通过在全局命名空间中查找来访问A

void foo(::A const& a) {} 
8

,如果你把它声明如下它的工作原理

struct A {}; 

struct B : private A {}; 

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

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

+1

这不是一个愚蠢的功能;它允许通过单独挑选用'using'公开的函数来限制继承的接口。 – avakar

+2

你可以使用转发器功能来完成这项功能,并使C++继承模型变得更加混乱。私有继承不是继承,其组成和使用相同的语义来完成两个单独的概念只是混淆。 – rerun

+2

这是组成和私人遗产之间的区别,因为后者允许您访问您父亲的受保护成员,而前者不会。 – bitmask