gpt4 book ai didi

c++ - 具有继承的 friend 类

转载 作者:可可西里 更新时间:2023-11-01 16:29:18 25 4
gpt4 key购买 nike

如果我有两个继承类如下:

class A
{
...
}

class B : public A
{
...
}

第三个类定义为 friend 类 A:

class C
{
friend class A;
}

我是否能够从 class B(也是 A 类型的对象)访问 class C 的所有成员,就好像我一开始就定义了 class B friend Class 吗?

最佳答案

friendship 既不继承也不传递。两个类之间是严格的一对一关系。

class A {
friend class B;
int Aries;
};

class B {
friend class C;
int Taurus;
};

class C {
int Leo;
void Capricorn() {
A a;
a.Aries = 0; // this wont work, C is not a friend of A.
// friendship is not transitive
}
};

class D : public C {
void Gemini() {
B b;
b.Taurus = 0; // this wont work, D is not a friend of B.
// friendship is not inherited
}
};

class E : public B {
void Scorpio() {
C c;
c.Leo = 0; // this wont work either, friendship is not inherited
}
};

引用资料:《C++ 编程语言》Bjarne Stroustrup

更多解释(我的):如果 friendship 不是一对一的,那么封装就结束了。请注意,仅当 A 的类声明声明了 B 时,B 类才能访问 Aprivate 成员 作为 friend B 无法在 A 上执行 friendship。

现在,如果可以继承友元,那么某人只需要继承 B 就可以访问 A 的私有(private)成员,而 A 没有任何说防止它。此外,允许 friendship 传递会导致其他问题,因为现在 B 可能有一个 friend C ,他又可以有一个 friend D,一直到 ZBCD、...、Z 现在都可以访问 Aprivate 成员,这将是一场灾难。

关于c++ - 具有继承的 friend 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844129/

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