gpt4 book ai didi

c++ - friend 类对象可以访问派生类对象上的基类私有(private)成员吗?

转载 作者:IT老高 更新时间:2023-10-28 23:14:01 24 4
gpt4 key购买 nike

我很惊讶下面的代码可以编译。

似乎与(公共(public)继承的)基类友好的类可以访问基类的成员,前提是派生类的实例。

如果继承改为private则编译失败。

简而言之,d.b_varF::func(D&d)中如何有效?

#include <iostream>
#include <string>
using namespace std;

class B{
int b_var;
friend class F;
};

class D: public B{
int d_var;
};

class F{
public:
void func(D &d){
d.b_var = 5;
}
};

int main()
{
cout<<"fine";
}

最佳答案

class D的对象由两部分组成:

part containing members of B 
part containing members of D

这就是为什么我们这样做时对象切片的概念起作用的原因:

D objD;
B objB = objD;

现在我们可以通过objBclass D对象中访问包含B成员的部分。编译器记住或可以区分 class D 中的两个部分。所以编译器知道通过什么来访问什么。

class B里面的语句friend class F;只是告诉class F的成员函数可以访问private,protected class B 的公共(public) 成员。也就是说,对于class F的成员函数,class B的所有成员都是public

实际上,在每个类中都包含三个可访问性部分:

public
protected
private

所以当我们声明一些class B时:

class B
{
public:
int a;
protected:
int b;
public:
int c;
};

然后在类 B 中创建以下 3 个部分,如上所示。

现在,当我们声明某个 class Fclass Bfriend 时:

class B
{
friend class F;
private:
int a;
protected:
int b;
public:
int c;
};

然后编译器创建如下部分:

class B
{
friend class F;
private:
int a;
protected:
int b;
public:
int c;
//int a; only for member functions of class F
//int b; only for member functions of class F
};

请注意,int a;int b; 现在对于 class Fmember functions 是公共(public)的。

现在,当 class Dclass B 派生 publicly 时,class 的 public 部分B 成为 class Dpublic 部分。类似地,class Bprotected 部分变成 class Dprotected 部分。因此,class Bpublic 部分可以通过class D 的对象来访问。并且由于 B::a;B::b;F 类的成员函数 的公共(public)部分中,因此 B::aB::b 可以通过 class D 的对象访问。另请注意,虽然在推导后 int a;int b; 成为 class D 的成员,但编译器仍然能够区分它们并考虑它们B 类的一部分

现在,当 class D 是从 class B 派生 privately 然后 class 的 public 部分B 成为 class Dprivate 部分。类似地,class Bprotected 部分变成了class D 的protected 部分。因此,现在 class B 内的 public 部分部分不能通过 class D 的对象访问。回想一下,在 class B 中,B::a;B::b; 最初是在公共(public)部分的 members 函数中class F 但在 private 派生之后,class B 的成员即 B::aB::b 现在位于 class D 的私有(private)部分。因此,B::aB::b 不能通过 class D 的对象访问。另请注意,虽然在推导后 int a;int b; 成为 class D 的成员,但编译器仍然能够区分它们并考虑它们B 类的一部分class B的一些成员的可访问性和规则在派生后发生了变化。

由于这个问题在某种程度上与 public、protected 和 private 派生的效果有关,因此为了完整起见,请参阅: Why can a derived class not access a protected member of its base class through a pointer to base?

关于c++ - friend 类对象可以访问派生类对象上的基类私有(private)成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39384399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com