我最近不得不做这样的事情:
class A { };
class B : private A { };
class C : public B {
public:
A *myA;
};
int main() {
return 0;
}
我在尝试的三个编译器中出错了。当我将myA
的声明更改为::A *myA
时,一切正常。我在C ++标准中探讨过,发现了第11.2节第3段,其中说:
注意:私有基类的成员可能无法作为继承的成员名称访问,但可以直接访问。
哪个是相关的,但不清楚。为什么名称A
无法访问?如果A
未被隐藏会出现什么问题?
谢谢,
-Ben
答案 0 :(得分:3)
它可能会出现错误":
namespace nmsp
{
class A {};
}
class A {};
class B : private nmsp::A
{
// well-formed:
A* d; // refers to the injected-class-name nmsp::A!!
};
class C : public B
{
// ill-formed
A* p; // refers to the injected-class-name nmsp::A!!
};
它不应该依赖于base-clause中的access-specifier,而是使用::A
或nmsp::A
,否则它将是容易出错的IMO。