C++ 由于私有继承,无法访问类型

C++ 由于私有继承,无法访问类型,c++,inheritance,private,C++,Inheritance,Private,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的私人祖先,

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
继承,但在我的例子中,它没有真正的意义。

如果您按如下方式声明它,它就可以工作

struct A {};

struct B : private A {};

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

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

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

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

这根本不是一个愚蠢的特性;它允许通过使用单独挑选函数来使用“<代码>”来公开继承的接口。您可以使用具有该特性的转发器函数来进行处理,并且使C++继承模型不那么混乱。私有继承不是继承它的组合,使用相同的语义来完成两个不同的概念只会让人困惑。这是组合和私有继承之间的区别,因为后者允许你访问你父亲的受保护成员,而前者不允许。我仍然不建议使用它,除非在这种情况下。