c++ “friend”声明是否影响基类中成员的可访问性?

jvlzgdj9  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(138)

我对friend声明的有效性感到困惑。
在第一个示例中,Base中的friend声明导致我无法在main()函数中的d.jd.k上获得错误。
然而,在第二个例子中,friend声明似乎没有任何影响。编译器在main()中抛出错误,包括d.id.jd.k以及d.md.n
看起来publicprotected继承才是重要的。
例一:

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;
}
stszievb

stszievb1#

d.i是虚构的。Derived中没有i。它 * 有a的是Base,而Base本身有i。因此,要得到d.i,首先必须能够看到Derived::Base
如果你公开地继承自基类,这意味着任何代码都可以看到派生类的基类对象。如果你保护性地继承自基类,只有对派生类有保护访问权限的代码才可以看到派生类的基类对象。
mainBase的友元,而不是Derived。因此,它对Derived没有特殊访问权限。因此,如果使用受保护的继承,它将无法访问Derived::Base,因此也无法看到Derived::Base::i

相关问题