代码段:
class A
{
protected:
int b;
};
class B : public A
{
};
struct C : B
{
int call (const C&);
};
class D : B
{
int call (const C&);
};
int C::call (const C& c)
{
return c.b;
}
int D::call (const C& c)
{
return c.b;
}
int main (void)
{
return 0;
}
为什么c.b
可以访问C::call()
而不是D::call()
?
以下是GCC编译器给出的错误消息:
main.cpp: In member function 'int D::call(const C&)':
main.cpp:4:9: error: 'int A::b' is protected
int b;
^
main.cpp:29:14: error: within this context
return c.b;
^
答案 0 :(得分:1)
您的继承树如下:
所以C是一个B,它本身就是A.由于b受到保护,C和B可以访问它们从A继承的b。
同样,D是B,它本身就是A.所以D和B可以访问从A继承的b。
然而,C和D没有直接关系。他们就像另一个人的陌生人。所以C不能从D看到b,D也不能从C看到b。
首先,在以下代码中,您不会返回对象的b成员。您返回作为参数传递的另一个C对象的b:
int C::call (const C& c)
{
return c.b;
}
详细说明,C的任何成员函数都可以访问任何C对象的所有成员。所以这个函数是有效的C ++代码。
下一个功能也不起作用:
int D::call (const C& c)
{
return c.b;
}
传递给D的这个成员函数的参数是C类。如上所述,C和D没有直接关系。所以C对象就像是D的成员函数的黑盒子。因此该函数只能访问C的公共成员。
这就是您收到此错误消息的原因:D对象无法访问C对象的受保护或私有成员。