我有一个测验问题:
#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类,因此,在C类中,即使是公共成员,在C类中也变为了私有成员。 C类还声明了与主函数的友好关系(这是可以的,现在“main”函数可以调用C类的私有方法)。 然后有X和Y两个类,都从C类派生而来。 X类公开地从C类派生,Y类私有地从C类派生。
在“main”函数中,我创建了一个C类实例并调用了从A类继承而来的“ohai”方法,这很正常,因为主函数是C类的友元。 然后我创建了一个X类实例并调用了“ohai”方法-这出乎意料地奏效了! 但是当我创建一个Y类实例时,这就不起作用了!
我知道继承是不可继承的。因此,这不是友好关系继承,允许“main”在类X的对象上调用“ohai”方法。 类Y的问题证实了这一点,因为只需将继承类型更改为私有即可停止此操作。
我想知道为什么可以在X对象上调用“ohai”。继承不能提升函数的级别(从私有到公共),因此,如果X从C继承,即使是公开继承,所有C中的私有方法也应该在X中保持私有。并且由于友好关系不可继承,“main”方法也不应该能够调用X的私有方法。 Y类私有继承C类,这使得C类的所有成员在X中都是私有的,但是“ohai”方法已经在C类中是私有的(因为C类私有继承A类),因此这不应该改变任何东西,但是与X相比,它却以某种方式发生了变化。
请帮助我理解这个问题。 最好的问候 YotKay