我对friend
声明的有效性感到困惑。
在第一个示例中,Base
中的friend
声明导致我无法在main()
函数中的d.j
和d.k
上获得错误。
然而,在第二个例子中,friend
声明似乎没有任何影响。编译器在main()
中抛出错误,包括d.i
、d.j
、d.k
以及d.m
和d.n
。
看起来public
和protected
继承才是重要的。
例一:
struct Base
{
friend int main();
public:
int i;
protected:
int j;
private:
int k;
};
struct Derived : public Base
{
public:
int l;
protected:
int m;
private:
int n;
};
int main()
{
Derived d;
d.i = 1;
d.j = 2;
d.k = 3;
d.l = 4;
d.m = 5; //error
d.n = 6; //error
return 0;
}
例二:
struct Base
{
friend int main();
public:
int i;
protected:
int j;
private:
int k;
};
struct Derived : protected Base
{
public:
int l;
protected:
int m;
private:
int n;
};
int main()
{
Derived d;
d.i = 1; //error
d.j = 2; //error
d.k = 3; //error
d.l = 4;
d.m = 5; //error
d.n = 6; //error
return 0;
}
1条答案
按热度按时间stszievb1#
d.i
是虚构的。Derived
中没有i
。它 * 有a的是Base
,而Base
本身有i
。因此,要得到d.i
,首先必须能够看到Derived::Base
。如果你公开地继承自基类,这意味着任何代码都可以看到派生类的基类对象。如果你保护性地继承自基类,只有对派生类有保护访问权限的代码才可以看到派生类的基类对象。
main
是Base
的友元,而不是Derived
。因此,它对Derived
没有特殊访问权限。因此,如果使用受保护的继承,它将无法访问Derived::Base
,因此也无法看到Derived::Base::i
。