英文:
Does 'friend' declaration affect the accessibility of members in the Base class?
问题
在第一个示例中,Base
中的 friend
声明使得在 main()
函数中,d.j
和 d.k
不会导致错误。然而,在第二个示例中,friend
声明似乎没有任何影响。编译器在 main()
中对 d.i
、d.j
、d.k
、d.m
以及 d.n
都会抛出错误。
第一个示例中,public
和 protected
继承是起作用的。
英文:
I am confused on the effectiveness of a friend
declaration.
In the first example, this friend
declaration in Base
caused me to not get an error on d.j
and d.k
in the main()
function.
However, in the second example, it seems the friend
declaration has no impact at all. The compiler throws errors in main()
on d.i
, d.j
, d.k
as well as d.m
and d.n
.
It seems public
and protected
inheritance only matters.
Example 1:
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;
}
Example 2:
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
得分: 2
d.i
是虚构的。Derived
中没有 i
。它确实有一个 Base
,而 Base
本身有一个 i
。因此,要访问 d.i
,首先必须能够看到 Derived::Base
。
如果你公开继承自一个基类,那意味着任何代码都可以看到派生类的基类对象。如果你以保护方式继承自一个基类,只有具有对派生类的保护访问权限的代码才能看到派生类的基类对象。
main
是 Base
的友元,而不是 Derived
的友元。因此,它对 Derived
没有特殊访问权限。因此,如果你使用保护继承,它无法访问 Derived::Base
,因此也无法看到 Derived::Base::i
。
英文:
d.i
is a fiction. Derived
does not have i
in it. What it does have is a Base
, which itself has an i
in it. To get to d.i
therefore, one must first be able to see Derived::Base
.
If you publicly inherit from a base class, that means any code can see the derived class's base class object. If you protectedly inherit from a base class, only code with protected access to the derived class can see the derived'd class's base class object.
main
is a friend of Base
, not Derived
. So it has no special access to Derived
. Therefore, if you use protected inheritance, it cannot get to Derived::Base
and therefore cannot see Derived::Base::i
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论