不可否认,这个问题标题听起来与迈克一再提出的邻居问题完全相同.我发现了很多相同问题的问题,但没有一个是我的问题.
首先,我想澄清一下这个问题的背景:
1,c ++访问控制基于类而不是基于实例.因此,以下代码完全有效.
class Base { protected: int b_; public: bool IsEqual(const Base& another) const { return another.b_ == b_; // access another instance's protected member } };
2,我完全理解为什么以下代码无效 - 另一个代码可能是兄弟实例.
class Derived : public Base { public: // to correct the problem, change the Base& to Derived& bool IsEqual_Another(const Base& another) const { return another.b_ == b_; } };
现在是时候卸载我真正的问题了:
假设在Derived类中,我有一个Base实例数组.如此有效,Derived IS A Base(IS-A关系),Derived由Base(复合关系)组成.我从某个地方读到这个(指的是IS-A和Has-A的设计)是一种设计气味,我首先应该永远不会有这样的场景.嗯,例如,Fractals的数学概念可以通过IS-A和Has-A关系建模.但是,让我们暂时忽略对设计的看法,只关注技术问题.
class Derived : public Base { protected: Base base_; public: bool IsEqual_Another(const Derived& another) const { return another.b_ == b_; } void TestFunc() { int b = base_.b_; // fail here } };
错误消息已经非常清楚地说明了错误,所以在答案中无需重复:
Main.cpp:140:7:错误:'int Base :: b_'受保护int b_; ^ Main.cpp:162:22:错误:在此上下文中int b = base_.b_;
真的,根据以下2个事实,上面的代码应该有效:
1,C++访问控制基于类而不是基于实例(因此,请不要说我只能访问Derived的b_;我无法访问独立的Base实例的受保护成员 - 它是基于类的).
2,错误消息显示"在此上下文中" - 上下文是Derived(我试图从Derived中访问Base实例的受保护成员.这是受保护成员的特性 - 它应该能够从Base内部访问或者任何来自Base的东西.
那么为什么编译器会给我这个错误呢?