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

bit*_*ask 14 c++ inheritance private

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

struct A {};

struct B : private A {};

struct C : B {
  void foo(A const& a) {}
};
Run Code Online (Sandbox Code Playgroud)

编译这会产生:

1:10: error: ‘struct A A::A’ is inaccessible
6:12: error: within this context
Run Code Online (Sandbox Code Playgroud)

我的观点是:我从不想A作为祖先访问.事实上,如果A是一个私人祖先B,不应该对任何人完全不可见,但B(即C)?

当然,我可以使用protected继承,但在我的情况下,它并没有真正意义.

ava*_*kar 13

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

void foo(::A const& a) {}
Run Code Online (Sandbox Code Playgroud)


rer*_*run 8

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

struct A {};

struct B : private A {};

struct C : B {
  void foo(::A const& a) {}
};
Run Code Online (Sandbox Code Playgroud)

您看到的错误是名称解析无法访问.:: A表示查看全局命名空间而不是我继承的嵌套类类型.还记得私有继承只是说B有一个A和IMOHO是一个应该避免的愚蠢的语言功能.

  • 您可以使用转发器功能完成该功能,并使c ++继承模型不那么混乱.私有继承不是继承它的组成和使用相同的语义来完成两个单独的概念只是令人困惑. (2认同)
  • 这是组合和私有继承之间的区别,因为后者允许您访问父亲的受保护成员,而前者则不允许. (2认同)