【发布时间】:2016-12-10 21:52:59
【问题描述】:
我有以下测验问题:
#include <iostream>
using namespace std;
struct A
{
void ohai() { cout << "ohai" << endl; }
};
struct C : private A {
friend int main();
};
struct X : C {};
struct Y : private C {};
int main() {
C().ohai() // OK
X().ohai(); // OK
Y().ohai(); // Not OK
}
问题是 C 类是从 A 私有继承的。因此,A 的所有成员,即使是公共的,现在在 C 中都变为私有的。 C 类还声明了与主函数的友好性(这没关系,现在“主”函数可以调用 C 的私有方法)。 然后是类 X 和 Y,它们都是从 C 派生的。 X 公开派生自 C,Y 私下派生自 C。
在“main”函数中,我创建了 C 类的实例并调用从 A 私有继承的“ohai”方法,这很好,因为 main 是 C 的朋友。 然后我创建类 X 的实例并调用 'ohai' - 这出乎意料地有效! 但是当我创建 Y 类的实例时,这不起作用!
我知道继承是不可继承的。所以这不是继承友好性,它允许'main'在类X的对象上调用'ohai'方法。 类 Y 的东西证实了这一点,因为将继承类型更改为私有就足以停止此工作。
我想知道为什么在 X 对象上调用 'ohai' 是可以的。继承不能提升函数的级别(从私有到公共),所以如果 X 从 C 继承,即使是公开的,来自 C 的所有私有方法都应该在 X 中保持私有。由于友好性不可继承,“主”方法不应该能够调用 X 的私有方法。 Y类从C私有继承,这使得C的所有成员在X中都是私有的,但是'ohai'方法在C中已经是私有的(因为C是从A私有继承的)所以这不应该改变任何东西,但不知何故它确实(与 X 相比)。
请帮助我理解这个问题。 此致 优凯
【问题讨论】:
标签: c++