代码片段:
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;
^
最佳答案
您的继承树如下:
所以 C 是一个 B,它本身就是一个 A。因为 b 是 protected ,所以 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 的公共(public)成员。
这就是您收到此错误消息的原因:D 对象无权访问 C 对象的 protected 或私有(private)成员。
关于c++ - 对C++继承感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30326287/