gpt4 book ai didi

c++ - 继承和友元访问。 C++

转载 作者:可可西里 更新时间:2023-11-01 18:19:05 28 4
gpt4 key购买 nike

我有以下查询;

classB inherits from classA 
classC is friend of classB

这是否意味着 classC 应该能够访问 classA 的 protected 成员?由于classB继承自classA,classC可以访问classB中的所有内容吗?

最佳答案

[我原来的回答是废话。对此表示歉意。感谢@celtschk 指出这一点并提供更好的答案。]

如果 CB 的 friend ,它可以访问所有 B 的成员,无论是私有(private)的、公共(public)的还是 protected ,并且包括作为基础子对象一部分的可访问(公共(public)和 protected )成员:

struct A { protected: int a; };
struct B : A { private: int b; friend struct C; }

struct C
{
B x;
A w;

void f()
{
x.a = 1; // fine
x.b = 2; // fine

// w.a = 0; /* Error, #1 */
}

friend struct D; // see below
};

但是,友元既不是传递的也不是继承的:CB 的 friend ,但不是A 的 friend (参见#1)。此外,如果 DC 的好友,则 D 不会获得 C 的任何访问权限与 B 的友元提供了它,因此 D 无法访问 B 的非公共(public)成员。类似地,如果 struct E : C 继承自 C,那么 E 也不会自动成为 B 的友元:

struct D
{
B y;
void g()
{
// y.b = 3; /* Error! */
}
};

struct E : C
{
B z;
void h()
{
// y.b = 4; /* Error! */
}
}

也许可以用几点来概括发生了什么:

  • 派生类可以访问每个基类的所有公共(public)和 protected 成员。

  • 一个类的友元可以访问它可以访问的该类的所有成员(即除私有(private)基成员之外的所有成员)。

  • 友元不是继承的:如果一个类有 friend ,则该友元不适用于其任何基类或任何派生类。

  • friend 的 friend 不是 friend 。

关于c++ - 继承和友元访问。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10035655/

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